2011-08-04 149 views
4

我编写通过Linux TCP套接字进行通信的网络应用程序。最近我已经注意到发送系统调用会导致应用程序崩溃。当两个同伴都起来时它工作正常(我正在测试崩溃恢复)。但是,当一个同伴下来第二次崩溃执行这段代码。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

+1

您使用的信号能够帮助?你用'gdb'检查过它吗? –

+1

Valgrind?这不是内存泄漏,在'gdb'下运行它。您可能因'SIG_PIPE'而退出。 –

+2

[如何防止SIGPIPE或防止服务器结束?](http://stackoverflow.com/questions/6821469/how-to-prevent-sigpipe-or-prevent-the-server-from-ending) –

回答

0

您是否尝试过RTFM(可阅读手册)错误情况?你是否抓住或忽略任何信号? errno全局变量呢?

man send 

而且还TCP是流协议,因此建议使用常用的流式访问的命令如read(),write()方法,如果你不需要任何特殊的标志。

+0

我做到了。当发送没有返回并且应用程序退出时,执行任何操作(检查errno)都有点困难... – harnen

1

解决: USE MSG_EORMSG_NOSIGNALflag在发送功能如下

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

希望它