2016-03-11 82 views
-1

就我所瞭解的TCP/IP而言,它不能保證確認接收方(B)是否確實收到了來自發送方(A)的任何數據。例如: -套接字通信:接收成功後可以發送失敗嗎?

A: socket.write(1); 
B: socket.read(); // this can fail and A wouldn't know unless B sends an ACK 

我一直在想,是相反的情況也可能嗎?

A: socket.write(1); // can this fail while B does receive "1" without any error? 
B: socket.read(); 
+0

當然不能。這個問題沒有意義。 – EJP

+0

@EJP:我擔心的根源是我看到了寫/發送成功的情況,即使緊跟在斷開的連接之後(即數據不會在另一側接收),我也不確定在什麼情況下寫/發送操作*可能會失敗。謝爾蓋答的回答是我正在尋找的。 –

回答

1

有一個send()呼叫的4個不同的可能的結果:

  1. send()返回等於它的字節數的第三參數(LEN)。這意味着,消息已成功放入TCP堆棧,現在堆棧將盡其最大努力提供它。
  2. send()返回-1。這意味着,有一個本地可檢測的錯誤。例如,套接字未連接,消息太大而無法通過原子等。沒有發送任何消息。 errno將有錯誤的實際原因。
  3. send()返回一個非負數,不等於它的第三個參數。這意味着,send()無法發送整個消息,但發送了一部分消息。最有可能的原因是一個非阻塞的send()調用,並且發送緩衝區中沒有空間來容納其餘的。 errno將可能設置爲EAGAIN(EWOULDBLOCK)。這意味着,部分消息已發送,因此接收者可以看到它。
  4. 應用程序收到SIGPIPE信號。這意味着套接字在另一端被關閉,並且SIGPIPE未被抑制。什麼都沒有發送。
+0

謝謝,您的回答讓我無處置疑!現在很難想象如果發件人收到錯誤代碼,對方會如何收到正確的數據。 –

相關問題