首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux TCP套接字崩溃

Linux TCP套接字崩溃
EN

Stack Overflow用户
提问于 2011-08-04 17:16:01
回答 3查看 4.2K关注 0票数 4

我编写了通过Linux TCP套接字进行通信的网络应用程序。最近,我注意到发送系统调用使我的应用程序崩溃。当两个对等点都启动时,它工作得很好(我现在正在测试崩溃恢复)。但是当一个对等点宕机时,第二个就会崩溃,执行这段代码。

代码语言:javascript
复制
    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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-04 17:32:52

看起来你的应用程序忽略了SIGPIPE。有关详细信息,请参阅此帖子:

How to prevent SIGPIPEs (or handle them properly)

票数 6
EN

Stack Overflow用户

发布于 2012-12-06 15:02:41

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

代码语言:javascript
复制
if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1)

希望能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2011-08-04 17:21:28

您是否尝试过RTFM (阅读详细手册)有关错误条件的信息?你是否捕捉到或忽略了任何信号?那errno全局变量呢?

代码语言:javascript
复制
man send

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6938855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档