繁体   English   中英

发送数据包后接收字节时的C#表单冻结

[英]C# Form Freezing While Receiving Bytes After Packets Sent

好的,你们中的一些人可能不理解标题,但是我正在尝试为C#中的游戏工作。 它涉及到连接到套接字,以便我可以将数据包发送到服务器,并使一切正常工作。

但是问题是,当我发送完数据包后去接收时,该程序将全部冻结,甚至无法获得响应以确保其正常工作。 在这里,我将通过显示代码向您展示我的意思。

private void sendRawPackets(Socket s, string packet)
    {
        byte[] data = Encoding.ASCII.GetBytes(string.Format("{0}\0", packet));
        s.Send(data);
    }

    private void gethash(string cmd, string args)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = @"C:\Python27\python.exe";
        start.Arguments = string.Format("{0} {1}", cmd, args);
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                string result = reader.ReadLine();
                logkey = "";
                logkey = result;
            }
        }
        connect();
    }

    private void connect()
    {
        byte[] bytes = new byte[2024];
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sock.Connect(ip, port);

        sendRawPackets(sock, "<policy-file-request/>");
        sock.Receive(bytes);
        sendRawPackets(sock, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>");
        sock.Receive(bytes);
        sendRawPackets(sock, "<msg t='sys'><body action='login' r='0'><login z='Slime'><nick><![CDATA["+user.Text+"]]></nick><pword><![CDATA["+logkey+"]]></pword></login></body></msg>");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%1#2%-2");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%2#6%-1%");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%2#7%17610%69%0,-255,190%");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%");
        sock.Receive(bytes);
    }

但是无论如何,在connect()函数中,就是使用sendRawPackets()函数发送数据包的地方。 但是由于某种原因,当我尝试在发送数据包后获取字节时,该程序再次冻结并且不再继续。

我想知道是否有办法解决这个问题? 如果有人知道答案,那将真的有帮助。 :)

编辑基本上尝试使用此python代码并将其转换为C#代码,但对我而言效果不佳。

self.sendRawPacket(s, "<policy-file-request/>")
            s.recv(2024)
            self.sendRawPacket(s, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>")

如果您不想冻结UI线程,请尝试此操作

using System.ComponentModel;


private void connect()
{
    using(BackgroundWorker bw = new BackgroundWorker())
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sock.Connect(ip, port);
        bw.DoWork += (o, e) => {
            sendRawPackets(sock, "<policy-file-request/>");
            Thread.Sleep(600);
            sendRawPackets(sock, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>");
            Thread.Sleep(600);
            sendRawPackets(sock, "<msg t='sys'><body action='login' r='0'><login z='Slime'><nick><![CDATA[" + user.Text + "]]></nick><pword><![CDATA[" + logkey + "]]></pword></login></body></msg>");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%1#2%-2");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%2#6%-1%");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%2#7%17610%69%0,-255,190%");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%");
            Thread.Sleep(600);
        }

        bw.RunWorkerCompleted += (o, e) => {
            //When all the work is finished
        }

        //Runs the background worker
        bw.RunWorkerAsync();
    }

}

找出了问题。 当我尝试发送数据包时,我使用UDP和Dgram进行套接字类型的发送。

但是我真正需要做的是将protocoltype更改为Tcp并将SocketType更改为stream

对一切感到抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM