C# udp 套接字没有收到整个消息

标签 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 个请求中,其余数据得到输出,就好像它以某种方式被缓冲了一样。

我不知道为什么会这样。如果是,能否请您告诉我如何解决该问题?

谢谢 克鲁兹

最佳答案

好吧,经过 6 个小时的研究,我似乎终于想出了一个解决方案,所以这里对数据接收做了一个小改动,注意线程休眠 10 毫秒,这似乎是需要的让数据报按时到达。

    //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");
    }

如果您认为有更好或更优雅的方法来处理这个问题,请毫不犹豫地抨击我的代码,但请提供替代方案,因为我总是乐于学习新事物。问候,克鲁兹

关于C# udp 套接字没有收到整个消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468519/

相关文章:

c# - 在 WPF 控件可见性更改上应用动画

c# - 在 asp.net webforms 中使用 http put 方法

c# - 基于 ViewModel 状态显示 UI 错误消息的最佳实践

c# - 从 C# 中的脚本语言返回值的类型安全方法

c# - 用于安排单元测试的序列化对象图

c# - Visual Studio - ExcludeFromCodeCoverage

c# - gl.DrawArrays 中的 AccessViolationException

c# - 我想检查单元测试是否抛出了正确的业务异常?

c# - 使用 Json 文件的 Google 服务帐户身份验证

c# - 如何在 grpc 中返回 list<model>