读取Socket中部分可用数据时发生异常

本文关键字:异常 数据 Socket 中部 读取 | 更新日期: 2023-09-27 18:02:06

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

从套接字的缓冲区中一次拉出一个数据报
udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags);

,我有两个问题。第一个问题是当接收时,我从套接字中提取比可用字节少一个字节,并且我得到SocketException:

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

当(试图从可用的7个字节中提取6个字节):

Client.Available = 7
buffer = byte[1024]
offset = 0
size = 6
socketFlags = SocketFlags.None

底层套接字缓冲区大小很大,比如8k。我发现如果我设置size=Client。可用,我没有得到这个错误。由于某些原因,它不喜欢我试图从套接字中取出7个字节中的6个。

为了解决这个问题,我使用了重载
udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError socketError);

并忽略"error"。这让我接收到7个字节中的6个。

然而,第二个问题出现了,

当我在套接字上提取可用的7个字节中的6个字节时,缓冲区刷新,并且socket。Available = 0。让我困惑的是,这段代码可能在6个月前还在工作,但在另一台机器上。我已经做了一些阅读,我猜SocketException可能是由操作系统访问套接字引起的,但我当时和现在都使用Windows 7 64位。有没有人遇到过这样的问题,或者可能有一些知识来阐明这个问题?谢谢你的帮助!

读取Socket中部分可用数据时发生异常

您应该一次读取整个数据报。如果你不这样做,最多剩下的部分就丢失了。它不像TCP是字节流