SocketException在Socket中读取部分可用数据时

时间:2013-03-04 00:23:06

标签: c# .net sockets udp

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

一次从Socket的缓冲区中拉出一个数据报
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位。有没有人遇到这样的问题,或者可能有一些知识来阐明这个问题?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

你应该立刻读完整个数据报。如果你不这样做,其余的就会丢失。它不是像TCP这样的字节流。