我编写了通过Linux TCP套接字进行通信的网络应用程序。最近,我注意到发送系统调用使我的应用程序崩溃。当两个对等点都启动时,它工作得很好(我现在正在测试崩溃恢复)。但是当一个对等点宕机时,第二个就会崩溃,执行这段代码。
fprintf(stderr, "out_tcp %d\n", out_tcp);
if(send(out_tcp, &packet, sizeof(packet), 0) == -1)
fprintf(stderr, "send TCP error");
fprintf(stderr, "after send");套接字已准备好并已连接,并且在第二个对等项关闭之前执行了多次。我期望这段代码返回-1值,但它在输出时只生成"out_tcp 11“,然后应用程序退出。没有错误消息,没有来自send的返回值。我在Valgrind下运行它,它显示应用程序正常退出-没有错误/警告消息。
有谁知道如何调试它吗?要使用的工具?我非常坚持这一点,因为我没有得到任何信息。
提前感谢Harnen
发布于 2011-08-04 17:32:52
看起来你的应用程序忽略了SIGPIPE。有关详细信息,请参阅此帖子:
发布于 2012-12-06 15:02:41
已解决:在发送函数中使用MSG_EOR,MSG_NOSIGNALflag,如下所示
if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1)希望能有所帮助
发布于 2011-08-04 17:21:28
您是否尝试过RTFM (阅读详细手册)有关错误条件的信息?你是否捕捉到或忽略了任何信号?那errno全局变量呢?
man send另外,TCP是一种流协议,因此,如果您不需要任何特殊标志,则建议使用常见的流访问命令,如read()、write()。
https://stackoverflow.com/questions/6938855
复制相似问题