我使用带有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
})
我需要更改什么才能使此方法正常工作?
答案 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设置为您在中止之前愿意在字节之间等待的最长时间。