套接字通信:接收成功时可以发送失败



我所知,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() 返回等于其第 3 个参数 (len) 的字节数。这意味着,消息已成功放入TCP堆栈,现在堆栈将尽最大努力传递它。
  2. send()返回 -1。这意味着,存在本地可检测的错误。例如,套接字未连接,消息太大而无法以原子方式传递等。什么也没发。 errno将有错误的实际原因。
  3. send() 返回一个非负数,不等于它的第三个参数。这意味着,send()无法发送整个消息,而是发送了其中的一部分。最可能的原因是非阻塞send()调用,并且发送缓冲区中没有空间来容纳其余部分。 errno 可能会设置为 EAGAIN (EWILLBLOCK)。这意味着,消息的某些部分已发送,因此接收者可以看到它。
  4. 应用程序接收 SIGPIPE 信号。这意味着,套接字在另一端关闭,并且SIGPIPE未被抑制。什么也没发。

最新更新