套接字通信:接收成功后可以发送失败吗?
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 种不同的可能结果:
send()
returns 字节数等于它的第三个参数 (len)。这意味着,消息已成功放入 TCP 堆栈,现在堆栈将尽力传递它。
send()
returns -1。这意味着,存在一个本地可检测的错误。例如,套接字未连接、消息太大而无法自动传递等。没有发送任何内容。 errno
将给出错误的实际原因。
send()
returns 一个非负数,不等于它的第三个参数。这意味着,send()
无法发送整个消息,而是发送了其中的一部分。最可能的原因是非阻塞 send()
调用,发送缓冲区中没有空间容纳其余部分。 errno 可能会设置为 EAGAIN (EWOULDBLOCK)。这意味着,消息的某些部分已发送,因此接收者可以看到它。
- 应用程序收到 SIGPIPE 信号。这意味着套接字在另一侧被关闭,SIGPIPE 没有被抑制。什么都没有发送。
据我了解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 种不同的可能结果:
send()
returns 字节数等于它的第三个参数 (len)。这意味着,消息已成功放入 TCP 堆栈,现在堆栈将尽力传递它。send()
returns -1。这意味着,存在一个本地可检测的错误。例如,套接字未连接、消息太大而无法自动传递等。没有发送任何内容。errno
将给出错误的实际原因。send()
returns 一个非负数,不等于它的第三个参数。这意味着,send()
无法发送整个消息,而是发送了其中的一部分。最可能的原因是非阻塞send()
调用,发送缓冲区中没有空间容纳其余部分。 errno 可能会设置为 EAGAIN (EWOULDBLOCK)。这意味着,消息的某些部分已发送,因此接收者可以看到它。- 应用程序收到 SIGPIPE 信号。这意味着套接字在另一侧被关闭,SIGPIPE 没有被抑制。什么都没有发送。