2010-10-19 168 views
0

我試圖得到更好的異步使用套接字的句柄。根據這篇文章,http://msdn.microsoft.com/en-us/library/bew39x2a(v=VS.85).aspx,我應該能夠檢查EndReceive返回的字節數,如果它爲零,我知道我有所有的數據,如果它非零,可能有或可能沒有更多的數據未來。這是有道理的,但是當我最後一次調用BeginReceive時,通常在調用回調函數前幾分鐘...我假設某些東西需要超時,但更改Socket.ReceiveTimeout屬性似乎沒有效果。EndReceive什麼時候返回零字節

這真的是正確的模式,用於確定我何時收到所有數據?特別是當我不知道我收到的消息的格式?

回答

3

這取決於你所說的「所有數據」。另一端是否關閉了插座?如果沒有,你還沒有確實讀取所有的數據,因爲服務器可以在任何時候發送更多。

如果另一端已將關閉了套接字,那麼回調應該會很快發生。

+0

所以基本上,它是發送者的responsib在完成數據傳輸後關閉套接字?啊...我在編寫代理服務器的情況下這樣做,所以發件人是一個Web服務器。 Web服務器是否將套接字打開以處理來自同一客戶端的後續請求? – joelt 2010-10-19 17:27:19

+0

@ joelt:這取決於協議。在HTTP 1.0中,每個連接只對一個請求/響應對開放,所以服務器關閉了套接字。對於1.1,客戶端可以請求連接保持活動狀態。然後包含響應的長度,客戶端應該只嘗試讀取那麼多的數據。 – 2010-10-19 17:33:05

0

由於TCP是一個面向流的協議,有3層一般的方法來知道當消息已被完全接收的:

  1. 消息長度是已知的(可能是因爲它是一個固定長度,或者因爲在一些協議會告訴你它有多長)
  2. 有在消息的最後一個分隔符,你可以檢查
  3. 連接被關閉
相關問題