套接字通信:接收成功后可以发送失败吗?

时间:2016-03-11 20:32:51

标签: sockets tcp-ip

据我了解TCP / IP,它没有给出确认接收方(B)是否真正从发送方(A)收到任何数据的任何保证。 E.g:

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();

1 个答案:

答案 0 :(得分:1)

send()电话有4种不同的可能结果:

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