Socket.Avaliable 损失 C#

Socket.Avaliable loss C#

我使用 ReceiveTimeout = 1000 的 UDP 套接字编写了此方法。有时它会丢失第二个数据包:

private static byte[] ReceivePlainData(Socket socket) {
    var recievedData = new List<byte>();
    var buffer = new byte[1024];

    do {
        int recievedAmount;

        while (true) {
            try {
                recievedAmount = socket.Receive(buffer);
            }
            catch (SocketException) {
                continue;
            }

            break;
        }

        recievedData.AddRange(buffer.Take(recievedAmount));
    } while (socket.Available > 0);

    return recievedData.ToArray();
}

套接字初始化:

using (var socket = new Socket(SocketType.Dgram, ProtocolType.Udp) {
    ReceiveTimeout = 1000
})

我需要更改什么才能使此方法正常工作?

Socket.Available 仅告诉您数据是否已收到并可立即读取。它不会告诉您流是否完整。发送方可能仍处于生成或传输更多数据的过程中。如果您打算使用整个响应并依赖套接字在没有更多数据时由发送方关闭,请继续从套接字读取直到返回的字节数为 0(表示套接字已正常关闭)或发生异常(表示异常终止)。

MemoryStream stream = new MemoryStream();
int received;
var buffer = new byte[8096];

do {
    received = socket.Receive(buffer);
    stream.Write(buffer, 0, received);
} while (received > 0);

// Use the stream
// byte[] bytes = stream.ToArray();

将套接字的 ReceiveTimeout 设置为您愿意在中止之前在字节之间等待的最长时间。