为了账号安全,请及时绑定邮箱和手机立即绑定

如何能够在某个client异常退出后,dispatcher打印出相关信息,同时能够继续运行下去?

如何能够在某个client异常退出后,dispatcher打印出相关信息,同时能够继续运行下去?

蝴蝶不菲 2023-04-16 21:17:44
在linux环境下用C写了一个程序socket程序,实现功能如下:一个dispatcher,多个client,dispatcher向client分发任务,client完成后,将结果返回给dispatcher,dispatcher与client通过tcp连接问题是 当其中一个client异常退出后,会导致dispathcer也退出。
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

建议把server从client收数据的那几句贴出来。

多打一些log,确认下到底是哪一步错了。client挂掉不太可能会导致server也挂掉,我觉得应该是你的实现逻辑有错,比如说recv返回了-1(所以要打log),然后你没有做好判断,直接 buf[ret] = '\0' 写了错误的内存导致崩溃。

另外,开启coredump可以帮助你调试。例如执行ulimit -c 1024,然后用gcc/g++加上-g编译,再用gdb载入server崩溃产生的core文件,执行bt命令看看是哪一句出错了。


查看完整回答
反对 回复 2023-04-20
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

之前dispatcher等待client结果的部分代码:

struct net_header *ppackage = NULL;while(1)
{
    recv_package(sockfd, (struct net_header **)&ppackage, &recv_size);
    free(ppackage);
}

recv_package是对recv的简单包装,如果对端异常退出,ppackageNULL的,再去free,就出问题了。
现在改成:

if(recv_package(sockfd, (struct net_header **)&ppackage, &recv_size) == -1)
{    printf("dispatcher: recv error when waiting judge result.\n");    break;    //如果接收失败,跳出循环}free(ppackage);

当client退出后,dispather也能继续运行下去了。


查看完整回答
反对 回复 2023-04-20
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信