0

我有一个 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.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 可能是由操作系统访问套接字引起的,但我当时和现在都使用 Windows 7 64 位。有没有人遇到过这样的问题,或者可能有一些知识可以阐明这个问题?感谢你的帮助!

4

1 回答 1

1

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

于 2013-03-04T00:46:24.767 回答