-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(有序關閉),但後檢查告訴我,連接仍然打開...我是否正確?
- 有沒有系統調用(以關閉例如插座)發送塊之間和接收塊。
我的問題是:
當連接丟失,爲什麼?
當'recv'返回零時,表示另一側通常關閉連接。你不得不看另一面,看看它爲什麼這樣做。 –
「...但後檢查告訴我,連接仍然打開......」這聽起來像你使用'getpeername()'來測試連接的狀態。這不是'getpeername()'所做的。 – keithmo
沒有「檢查後」可以告訴你連接在沒有連接時仍處於打開狀態,並且你的代碼甚至無法嘗試使用連接。無論如何你還沒有發佈任何代碼。 – EJP