我正在编写一个通过套接字(从客户端到服务器)发送数据的应用程序。我观察到非常奇怪的行为:当我杀死服务器时,在该终止之后第一次发送的行为就像服务器存在一样。下一个返回EPIPE。你能解释一下为什么吗?

这是来自客户端应用程序的跟踪:

(server not killed)
...
sendto(5, "\0\1\0\0\0\0\0\0000\311\0\0\211A\264R\0\0\0\0\232\377\4\0\0\0\0\0\0\0\0\0"..., 51516, MSG_NOSIGNAL, NULL, 0) = 51516
....
(server killed)
****sendto(5, "\0\1\0\0\1\0\0\0000\311\0\0\272A\264R\0\0\0\0c%\0\0\0\0\0\0\0\0\0\0"..., 51516, MSG_NOSIGNAL, NULL, 0) = 51516,****
(next send after server is killed)
sendto(5, "\0\1\0\0\2\0\0\0000\311\0\0\375A\264R\0\0\0\0d\307\n\0\0\0\0\0\0\0\0\0"..., 51516, MSG_NOSIGNAL, NULL, 0) = -1 EPIPE (Broken pipe)

问候
Ĵ

最佳答案

TCP不保证在尝试向其发送一些数据之前,将检测到断开的连接。尝试这样做后,您可能会收到来自网络的错误消息,或者发送操作可能会超时。由于应用程序级TCP仅在缓冲区空间不足时才写,因此通常会在下一个报告错误的操作中报告错误。

尽管通常会立即检测到断开的连接,但并非总是如此,并且不能保证一定会断开。确切原因可能会因许多未知因素而有所不同。 (TCP连接是由服务器应用程序本身打开的吗?还是它继承了它或从另一个进程获取它?任何其他进程都可以拥有该套接字的副本吗?服务器是否使用该连接调用派生并没有在子进程中关闭它? ?)

关于c - sendto()到不存在的套接字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20704658/

10-16 23:10