2016-03-11 43 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

谢谢,您的回答让我无处置疑!现在很难想象如果发件人收到错误代码,对方会如何收到正确的数据。 –

相关问题