【问题标题】:Linux TCP socket crashLinux TCP 套接字崩溃
【发布时间】:2011-10-19 19:29:28
【问题描述】:

我编写了通过 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");

Socket 已经准备好并连接,并在第二个对等方关闭之前执行了几次。我预计此代码会返回 -1 值,但它仅在输出时产生“out_tcp 11”,然后应用程序退出。没有错误消息,发送没有返回值。我在 Valgrind 下运行它,它说应用程序正常退出 - 没有错误/警告消息。

有人知道如何调试它吗?使用的工具?我很坚持这一点,因为我没有得到任何信息。

提前致谢 哈嫩

【问题讨论】:

标签: c linux sockets tcp crash


【解决方案1】:

您的应用程序似乎忽略了 SIGPIPE。请参阅此主题以获取更多信息:

How to prevent SIGPIPEs (or handle them properly)

【讨论】:

  • 忽略 SIGPIPE 有帮助!谢谢!
【解决方案2】:

已解决: 在发送函数中使用MSG_EOR,MSG_NOSIGNALflag,如下所示

if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1)

希望对你有帮助

【讨论】:

    【解决方案3】:

    您是否尝试过 RTFM(阅读精美手册)来了解错误情况?你捕捉或忽略任何信号吗? errno 全局变量呢?

    man send
    

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

    【讨论】:

    • 我做到了。当发送没有返回并且应用程序退出时,做任何事情(检查 errno)有点困难......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多