Linux TCP套接字崩溃

4

我编写了一个通过Linux TCP套接字进行通信的网络应用程序。最近我注意到,send系统调用会导致我的应用程序崩溃。当两个对等端都处于正常运行时,它可以正常工作(现在正在测试故障恢复)。但是,当一个对等端宕机时,第二个对等端执行以下代码时会崩溃。

    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”,然后应用程序退出。没有错误消息,也没有从发送返回的值。我在Valgrind下运行它,它说应用程序正常退出 - 没有错误/警告消息。
有人有任何想法如何调试它?要使用的工具?我因为没有得到任何信息而陷入了困境。
提前致谢 Harnen

1
你是否在使用信号?你是否用gdb检查过它? - Karoly Horvath
1
Valgrind?这不是内存泄漏,用gdb运行它。你可能因为SIG_PIPE而退出。 - Steve-o
2
可能是如何防止SIGPIPE或防止服务器终止?的重复问题。 - Steve-o
3个回答

6

看起来你的应用程序正在忽略SIGPIPE信号。请参考此帖子了解更多信息:


忽略 SIGPIPE 有所帮助!谢谢! - harnen

1
已解决: 在发送函数中使用MSG_EORMSG_NOSIGNALflag,如下所示。
if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1)

希望能够帮到你


0

你尝试过RTFM(阅读精细手册)来了解错误条件吗?你捕获或忽略任何信号吗?errno全局变量呢?

man send

而且TCP是一种流式协议,因此建议使用常规的流式访问命令(如read(), write()),如果您不需要任何特殊标记。


我做了。当send不返回并且应用程序退出时,检查errno以执行任何操作都有点困难... - harnen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接