据我了解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();
答案 0 :(得分:1)
send()
电话有4种不同的可能结果:
send()
返回等于它的第三个参数(len)的字节数。这意味着,消息已成功放入TCP堆栈,现在堆栈将最好将其传递给它。send()
返回-1。这意味着,存在本地可检测的错误。例如,套接字未连接,消息太大而无法原子传递等。没有发送任何内容。 errno
将有错误的实际原因。send()
返回一个非负数,不等于它的第三个参数。这意味着,send()
无法发送整个消息,但发送了一部分消息。最有可能的原因是非阻塞send()
调用,并且发送缓冲区没有空间来适应其余部分。 errno可能会设置为EAGAIN(EWOULDBLOCK)。这意味着,邮件的某些部分已发送,因此接收者可以看到它。