Socket.Avaliable loss C#

时间:2018-05-27 23:31:58

标签: c# sockets udp timeout

我使用带有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
})

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

1 个答案:

答案 0 :(得分:0)

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设置为您在中止之前愿意在字节之间等待的最长时间。