84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
在linux环境下用C写了一个程序socket程序,实现功能如下:
一个dispatcher,多个client,dispatcher向client分发任务,client完成后,将结果返回给dispatcher,dispatcher与client通过tcp连接
问题是 当其中一个client异常退出后,会导致dispathcer也退出。如何能够在某个client异常退出后,dispatcher打印出相关信息,同时能够继续运行下去?
建议把server从client收数据的那几句贴出来。
多打一些log,确认下到底是哪一步错了。client挂掉不太可能会导致server也挂掉,我觉得应该是你的实现逻辑有错,比如说recv返回了-1(所以要打log),然后你没有做好判断,直接 buf[ret] = '\0' 写了错误的内存导致崩溃。
另外,开启coredump可以帮助你调试。例如执行ulimit -c 1024,然后用gcc/g++加上-g编译,再用gdb载入server崩溃产生的core文件,执行bt命令看看是哪一句出错了。
估计和我回答的这个问题类似,你先看下有没有用http://segmentfault.com/q/10100000001...
dispatcher端可以考虑用多进程/多线程实现
可能我的问题描述过于简单,又没有贴代码,自己重新看了下代码,发现了问题,之前dispatcher等待client结果的部分代码:
struct net_header *ppackage = NULL; while(1) { recv_package(sockfd, (struct net_header **)&ppackage, &recv_size); free(ppackage); }
recv_package是对recv的简单包装,如果对端异常退出,ppackage是NULL的,再去free,就出问题了。 现在改成:
recv_package
recv
ppackage
NULL
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也能继续运行下去了。 谢谢各位~
建议把server从client收数据的那几句贴出来。
多打一些log,确认下到底是哪一步错了。client挂掉不太可能会导致server也挂掉,我觉得应该是你的实现逻辑有错,比如说recv返回了-1(所以要打log),然后你没有做好判断,直接 buf[ret] = '\0' 写了错误的内存导致崩溃。
另外,开启coredump可以帮助你调试。例如执行ulimit -c 1024,然后用gcc/g++加上-g编译,再用gdb载入server崩溃产生的core文件,执行bt命令看看是哪一句出错了。
估计和我回答的这个问题类似,你先看下有没有用
http://segmentfault.com/q/10100000001...
dispatcher端可以考虑用多进程/多线程实现
可能我的问题描述过于简单,又没有贴代码,自己重新看了下代码,发现了问题,之前dispatcher等待client结果的部分代码:
recv_package
是对recv
的简单包装,如果对端异常退出,ppackage
是NULL
的,再去free
,就出问题了。现在改成:
当client退出后,dispather也能继续运行下去了。
谢谢各位~