C# 读取套接字中的部分可用数据时发生SocketException

C# 读取套接字中的部分可用数据时发生SocketException,c#,.net,sockets,udp,C#,.net,Sockets,Udp,我有一个UdpClient向另一个客户端来回发送小数据报。我试图使用 udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags); 我有两个问题。第一个问题是,当接收时,我从套接字中提取的字节比可用字节少一个字节,我得到一个SocketException: 在数据报套接字上发送的消息大于内部消息缓冲区或某些其他网络限制,或者用于接收数据报的缓冲区小于数据报本身 当(尝试从可用的7个

我有一个UdpClient向另一个客户端来回发送小数据报。我试图使用

udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags);
我有两个问题。第一个问题是,当接收时,我从套接字中提取的字节比可用字节少一个字节,我得到一个SocketException:

在数据报套接字上发送的消息大于内部消息缓冲区或某些其他网络限制,或者用于接收数据报的缓冲区小于数据报本身

当(尝试从可用的7个字节中提取6个字节时)出现这种情况:

底层套接字缓冲区的大小很大,比如8k。我发现,如果我设置size=Client.Available,就不会出现此错误。出于某种原因,我不想从套接字中取出7个字节中的6个

为了解决这个问题,我使用了过载

udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError socketError);
忽略了“错误”。这让我可以接收7个字节中的6个

然而,这让位于第二个问题,即:


当我提取套接字上7个可用字节中的6个时,缓冲区将刷新,socket.available=0。让我困惑的是,这段代码可能在6个月前还在工作,但在另一台机器上。我读过一些书,我想SocketException可能是操作系统访问套接字造成的,但我当时和现在都在使用64位Windows 7。有没有人经历过这样的问题,或者可能有一些知识来阐明这个问题?谢谢你的帮助

您应该一次读取整个数据报。如果你不这样做,充其量剩下的就失去了。它不像TCP那样是字节流。

如果在轮询套接字之前两个数据报到达,会发生什么?假设缓冲区未满,第一个会被扔出还是他们都会在缓冲区中等待?@Alng如果他们都合适,他们都会被缓冲,如果他们不合适,那么第二个很容易丢失,而不是第一个。
udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError socketError);