我编写通过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”然后应用程序退出。没有错误消息,没有发送的返回值。我在Valgrind下运行它,它说应用程序正常退出 - 没有错误/警告消息。
有谁知道如何调试它?使用工具?因为我没有信息,所以我非常坚持这一点。
提前致谢 Harnen
答案 0 :(得分:6)
看起来您的应用程序忽略了SIGPIPE。请参阅此主题以获取更多信息:
答案 1 :(得分:1)
解决:
在发送功能中使用MSG_EOR
,MSG_NOSIGNALflag
如下
if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1)
希望有所帮助
答案 2 :(得分:0)
您是否尝试过关于错误情况的RTFM(阅读精细手册)?你抓住或忽略任何信号吗?那么errno全局变量呢?
man send
TCP也是一种流协议,因此如果您不需要任何特殊标志,建议使用常见的流式访问命令,如read(),write()。