簡體   English   中英

套接字通信:接收成功時可以發送失敗嗎?

[英]Socket communication: can send fail when receive succeeded?

據我了解 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();

send()調用有 4 種不同的可能結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM