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

C#在发送数据包后接收字节时冻结表单,c#,sockets,C#,Sockets,好吧,你们中的一些人可能不理解这个标题,但我正在努力为C#游戏做一些事情。它涉及到连接到一个套接字,这样我就可以向服务器发送数据包,让一切正常工作 但问题是,当我在发送一个数据包之后去接收时,程序就完全冻结了,我甚至无法得到一个响应来确保它正常工作。在这里,我将向您展示一下我的代码是什么意思 private void sendRawPackets(Socket s, string packet) { byte[] data = Encoding.ASCII.GetByte

好吧,你们中的一些人可能不理解这个标题,但我正在努力为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);
    }
private void发送数据包(套接字、字符串数据包)
{
byte[]data=Encoding.ASCII.GetBytes(string.Format(“{0}\0”,packet));
s、 发送(数据);
}
私有void gethash(字符串cmd,字符串args)
{
ProcessStartInfo start=新的ProcessStartInfo();
start.FileName=@“C:\Python27\python.exe”;
start.Arguments=string.Format(“{0}{1}”,cmd,args);
start.UseShellExecute=false;
start.RedirectStandardOutput=true;
使用(Process进程=Process.Start(Start))
{
使用(StreamReader=process.StandardOutput)
{
字符串结果=reader.ReadLine();
logkey=“”;
logkey=结果;
}
}
connect();
}
专用void connect()
{
字节[]字节=新字节[2024];
Socket sock=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
sock.Connect(ip,端口);
发送数据包(sock,“”);
sock.Receive(字节);
发送数据包(sock,“”);
sock.Receive(字节);
发送数据包(sock,“”);
sock.Receive(字节);
发送数据包(sock,“%xt%login%1#2%-2”);
sock.Receive(字节);
sendRawPackets(sock,“%xt%login%2#6%-1%”;
sock.Receive(字节);
sendRawPackets(sock,“%xt%login%2#7%17610%69%0,-255190%”;
sock.Receive(字节);
sendRawPackets(sock,“%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%”;
sock.Receive(字节);
}
但是无论如何,在connect()函数中,就是使用sendRawPackets()函数发送数据包的地方。但由于某种原因,当我试图在发送数据包后获取字节时,程序再次冻结,无法继续

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

EDIT基本上是尝试使用这个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>")
self.sendRawPacket(“”)
s、 recv(2024年)
self.sendRawPacket(“”)

如果不想使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();
    }

}
使用System.ComponentModel;
专用void connect()
{
使用(BackgroundWorker bw=新的BackgroundWorker())
{
Socket sock=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
sock.Connect(ip,端口);
bw.DoWork+=(o,e)=>{
发送数据包(sock,“”);
睡眠(600);
发送数据包(sock,“”);
睡眠(600);
发送数据包(sock,“”);
睡眠(600);
发送数据包(sock,“%xt%login%1#2%-2”);
睡眠(600);
sendRawPackets(sock,“%xt%login%2#6%-1%”;
睡眠(600);
sendRawPackets(sock,“%xt%login%2#7%17610%69%0,-255190%”;
睡眠(600);
sendRawPackets(sock,“%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%”;
睡眠(600);
}
bw.RunWorkerCompleted+=(o,e)=>{
//当所有的工作都完成时
}
//运行后台工作程序
RunWorkerAsync();
}
}

解决了这个问题。当我尝试发送数据包时,我使用UDP和Dgram作为套接字类型

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


非常抱歉。

我不知道为什么要加入线程。Sleep()函数。那就别笑了,把它们拿出来。如果你不知道他们为什么在那里,不要把他们放在那里。然后使用调试器一步一步地检查代码,看看它到底卡在了什么地方。@KenWhite这肯定不是线程的问题。Sleep()这才是问题所在。我之所以把它们放在那里,是因为对于我制作的游戏来说,利用API或向服务器发送数据包是有限制的。Sleep()只是为了防止达到限制。这正是我要做sock.Receive()的时候;在发送包裹后,我没有说它们在哪里。我说过,如果你能写一些东西,比如我不知道为什么……lmao,你应该停止到处乱扔代码,努力理解这些代码的作用以及你为什么要使用它。作为一名程序员,不仅仅是随意敲击键盘。@KenWhite是的,我知道,对不起。无论如何,我只是需要帮助来解决这个问题。通过查看python脚本(是的,我知道python与C#不同),发送数据包后,用户让脚本执行,例如“s.recv(2024)”,或者代替2024将是1024,等等。在接收时尝试设置字节,但当它冻结时。我也试着设置了一个超时,但我只是从中得到了一个错误。我一直在尝试做大量的研究,从30分钟的视频到阅读有关函数的内容,以及查看其他代码示例。但是代码不同。它应该冻结,因为您正在使用
线程。Sleep
尝试在C#中搜索异步方法,例如
任务
BackgroundWorker
我非常抱歉浪费您的时间来帮助我。我想我会把人搞糊涂的。我的意思是输入接收代码,这就是为什么发送数据包后会冻结。Y