2013-02-21 42 views
0

時收到FD_CLOSE我的客戶端工作站有一個奇怪的問題。我有一個簡單的應用程序,通過網絡在兩個端點之間交換一些數據。當應該有FD_READ

基本上事務是這樣的:

  1. 客戶端A監聽進來的連接
  2. 客戶端B連接到A和發送一些數據
  3. 客戶端A讀取該數據以供進一步處理

現在奇怪的部分是客戶端A沒有收到整個數據(有時它是緩衝區的一部分,有時它是空的)。

A客戶端使用WSAEventSelect函數,並等待FD_READ讀取B發送的數據,並等待FD_CLOSE檢測斷開連接。

通常(除了這一個特定的客戶端以外)FD_READ被髮信號,數據被處理,然後FD_CLOSE被髮信號並且一切正常,但是這裏FD_READ我接收FD_CLOSE。

有人能告訴我這可能嗎?另一件事是該程序運行良好大約一年,並突然崩潰。

回答

0

現在奇怪的部分是客戶端A沒有收到整個數據(有時它是緩衝區的一部分,有時它是空的)。

沒有什麼奇怪的,TCP是如何工作的,除了在阻塞模式下永遠不會收到零字節。

一般(除非這一個特定客戶端每次)的FD_READ用信號,數據進行處理並FD_CLOSE被髮信號後,所有是好的,但在這裏代替FD_READ我接收FD_CLOSE。

請注意,FD_READ可以發送任意次數的信號,而不僅僅是一次。您無法保證在一次閱讀中收到完整的信息。

有人可以告訴我這可能嗎?

客戶端已關閉連接。

+2

「你永遠不會在阻塞模式下收到零字節」,是的,你會的。這就是報告的正常斷開連接 - 通過'recv()'返回0。 – 2013-02-22 01:37:17

+0

我知道FD_READ可以發信號一次,但它爲什麼沒有發信號,我收到只是FD_CLOSE – 2013-02-22 07:42:54

+0

@RemyLebeau當然,但不是接收零字節,這是使用零作爲一個標記來表明EOS,它只是可能*因爲*你永遠不會收到零字節。 – EJP 2013-02-22 22:03:17