C#udp socket没有收到整条消息

时间:2012-11-20 07:35:45

标签: c#

我有以下方法将rcon命令发送到游戏服务器。

public string sendCommand(string command)
{
byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
byte[] bufferSend = new byte[bufferTemp.Length + 4];

//big enough to receive response
byte[] bufferRec = new byte[65000];

//intial 4 characters as per standard
bufferSend[0] = byte.Parse("255");
bufferSend[1] = byte.Parse("255");
bufferSend[2] = byte.Parse("255");
bufferSend[3] = byte.Parse("255");
int j = 4;

for (int i = 0; i < bufferTemp.Length; i++)
{
    bufferSend[j++] = bufferTemp[i];
}

//send rcon command and get response
try
{
    this.server.Socket.Send(bufferSend, SocketFlags.None);
    this.server.Socket.Receive(bufferRec);
}
catch (SocketException e)
{
    MessageBox.Show(e.ToString(), "Error occured");
}

string response = Encoding.ASCII.GetString(bufferRec);

return response;
}

在我可能发送的所有命令中,其中1个返回的数据比其他命令多得多,似乎* buffer_rec *字节数组只获得消息的1/4左右,但该数组已被声明大到足以包含所有数据。 在随后的3个请求中,其余数据将被输出,就像它以某种方式缓冲一样。

我不知道为什么会这样。如果你这样做,请告诉我如何解决这个问题?

谢谢 Crouz

1 个答案:

答案 0 :(得分:-2)

好吧,似乎经过6个小时的调查后我终于想出了一个解决方案,所以这里是对数据接收的一个小改动,注意线程睡了10ms,这似乎需要让数据报在适当的时候到达。

    //send rcon command and get response
    string response = "";
    try
    {
        this.server.Socket.Send(bufferSend, SocketFlags.None);

        do
        {
            int bytesReceived = this.server.Socket.Receive(bufferRec);
            response += Encoding.ASCII.GetString(bufferRec, 0, bytesReceived);
            System.Threading.Thread.Sleep(10);
        } while (this.server.Socket.Available > 0);
    }
    catch (SocketException e)
    {
        MessageBox.Show(e.ToString(), "Error occured");
    }

如果您认为有更好或更优雅的方式来处理这个问题,请不要犹豫我的代码,但通过提供替代方案来实现,因为我总是乐于学习新事物。此致,Crouz