2013-03-04 106 views
0

中的部分可用数据时,我有一个UdpClient来回发送小数据报到另一个客户端。我试图通过使用SocketException当读取套接字

udpClient.Client.Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags); 

一次拉出一个数据报,我有两个问题。第一个问题是在接收时,我拉一个字节小于可从插座和我接收到一个SocketException:

在数据报套接字上发送的消息大于内部消息缓冲器或某种其它网络较大限制,或用于接收数据报的缓冲区比数据报小

这是当(试图拉6个字节可用7)的情况下:

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

底层套接字缓冲区大小是somethi像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

你应该一次读取整个数据报。如果你不这样做,最好的情况是其余部分丢失。它不像TCP那样是一个字节流。

+0

如果两个数据报在套接字轮询之前到达会发生什么?如果缓冲区未满,是第一个被抛出还是会在缓冲区等待? – Softerware 2013-03-04 03:11:18

+0

@Alng如果他们都适合,他们都被缓冲,如果他们不这样做,这是第二个可能会丢失,而不是第一个。 – EJP 2013-03-05 00:47:39