2016-01-08 148 views
-1

我一直在測試TCP客戶端/偵聽器。TCP不接收已發送的數據

我的測試打開10個客戶並正確接受它們。然後它通過它們中的每一個發送一些數據。只有在正確發送所有數據後,纔會嘗試在對方收到它。

在這裏你可以看到strace的輸出爲前4個連接。 getpeername()被用於檢查每一個剛後每一側上的連接發送和接收。我已經嘗試在迴路內執行接收,直到它獲得沒有效果。因此,爲了清楚起見,我顯示了每個連接的單個recv的結果。

send(4, "abcdefghij", 10, 0)   = 10 
getpeername(4, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(5, {sa_family=AF_INET, sin_port=htons(44847), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
send(6, "abcdefghij", 10, 0)   = 10 
getpeername(6, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(7, {sa_family=AF_INET, sin_port=htons(44848), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
send(8, "abcdefghij", 10, 0)   = 10 
getpeername(8, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(9, {sa_family=AF_INET, sin_port=htons(44849), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
send(10, "abcdefghij", 10, 0)   = 10 
getpeername(10, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(11, {sa_family=AF_INET, sin_port=htons(44850), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
[...] 
recv(5, "", 10, 0)      = 0 
getpeername(4, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(5, {sa_family=AF_INET, sin_port=htons(44847), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
recv(7, "abcdefghij", 10, 0)   = 10 
getpeername(6, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(7, {sa_family=AF_INET, sin_port=htons(44848), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
recv(9, "", 10, 0)      = 0 
getpeername(8, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(9, {sa_family=AF_INET, sin_port=htons(44849), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
recv(11, "abcdefghij", 10, 0)   = 10 
getpeername(10, {sa_family=AF_INET, sin_port=htons(1366), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
getpeername(11, {sa_family=AF_INET, sin_port=htons(44850), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 
[...] 

注:

  • 所述發送的消息的接收只發生在甚至連接(客戶端0,客戶端2,客戶機4 ...)。
  • 每個連接都使用阻塞套接字,所以recv()應該永遠等待。
  • 失敗的連接返回0(有序關閉),但後檢查告訴我,連接仍然打開...我是否正確?
  • 沒有系統調用(以關閉例如插座)發送塊之間和接收塊。

我的問題是:

當連接丟失,爲什麼?

+0

當'recv'返回零時,表示另一側通常關閉連接。你不得不看另一面,看看它爲什麼這樣做。 –

+1

「...但後檢查告訴我,連接仍然打開......」這聽起來像你使用'getpeername()'來測試連接的狀態。這不是'getpeername()'所做的。 – keithmo

+1

沒有「檢查後」可以告訴你連接在沒有連接時仍處於打開狀態,並且你的代碼甚至無法嘗試使用連接。無論如何你還沒有發佈任何代碼。 – EJP

回答

0

的插座被搞砸與應用程序,並在沒有足夠的調試問題,問題出在日誌。

用鐵絲鯊魚捕獲數據幫助察覺的問題:應用程序複製插座,由於邏輯問題,客戶端使用那些錯誤的傳送。

感謝您的提示:幫助我們改進了代碼。