2013-03-04 104 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