gpt4 book ai didi

c - sendto() 到不存在的套接字

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:48 26 4
gpt4 key购买 nike

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

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

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

问候J

最佳答案

TCP 不保证在您尝试在其上发送一些数据之前会检测到断开的连接。一旦您尝试这样做,您可能会收到网络返回的错误或者发送操作可能会超时。由于应用程序级 TCP 写入仅在没有足够的可用缓冲区空间时才会阻塞,因此通常会在下一个可以报告这些错误的操作时报告错误。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com