2010-05-07 53 views
2

我的情況是這樣的:我有一個C#tcp套接字,通過它我可以接收由3個字節的頭部和一個可變大小的有效載荷組成的結構化消息。 tcp數據通過隧道網絡進行路由,偶爾也容易發生分裂。解決方法是對頭進行3字節的塊讀取,對於可變大小的有效負載(N的值在頭中)進行N字節的塊讀取。我遇到的問題是偶爾阻塞接收操作返回一個部分數據包。也就是說,它讀取的字節數量少於我在接收調用中明確設置的數量。經過一些調試後,它返回的字節數似乎等於接收操作之前套接字的可用屬性中的字節數。C#套接字阻止行爲

這種行爲與我的期望相反。如果套接字被阻塞,並且我明確設置了要接收的字節數,那麼不應該直到套接字阻塞它的recv的那些字節?,任何幫助,指針等等都將不勝感激。

回答

2

該行爲取決於您使用的套接字的類型。 TCP是一種面向連接的插座,其中means

如果使用面向連接的插座,該接收方法將讀取儘可能多的數據是可用的,直到由大小指定的字節數參數。如果遠程主機使用Shutdown方法關閉Socket連接,並且已收到所有可用數據,則Receive方法將立即完成並返回零字節。

當使用TCP套接字時,您必須爲此做好準備;檢查Receive方法的返回值,如果結果小於預期的值,則Receive,直到套接字關閉或實際接收到儘可能多的數據爲止。

+0

在這種情況下,C#中的阻塞和非阻塞套接字有什麼區別,甚至提供阻塞選項的意義何在?,順便說一句,謝謝。 – 2010-05-07 14:10:16

+0

Doh !.剛剛意識到了爲什麼,阻塞套接字將在空緩衝區中掛起,直到數據進入,它只是數據量不一定等於recv調用中指定的大小。 – 2010-05-07 14:26:57