在linux環(huán)境下用C寫了一個程序socket程序,實現(xiàn)功能如下:一個dispatcher,多個client,dispatcher向client分發(fā)任務,client完成后,將結(jié)果返回給dispatcher,dispatcher與client通過tcp連接問題是 當其中一個client異常退出后,會導致dispathcer也退出。
2 回答
桃花長相依
TA貢獻1860條經(jīng)驗 獲得超8個贊
建議把server從client收數(shù)據(jù)的那幾句貼出來。
多打一些log,確認下到底是哪一步錯了。client掛掉不太可能會導致server也掛掉,我覺得應該是你的實現(xiàn)邏輯有錯,比如說recv返回了-1(所以要打log),然后你沒有做好判斷,直接 buf[ret] = '\0' 寫了錯誤的內(nèi)存導致崩潰。
另外,開啟coredump可以幫助你調(diào)試。例如執(zhí)行ulimit -c 1024,然后用gcc/g++加上-g編譯,再用gdb載入server崩潰產(chǎn)生的core文件,執(zhí)行bt命令看看是哪一句出錯了。
明月笑刀無情
TA貢獻1828條經(jīng)驗 獲得超4個贊
之前dispatcher等待client結(jié)果的部分代碼:
struct net_header *ppackage = NULL;while(1)
{
recv_package(sockfd, (struct net_header **)&ppackage, &recv_size);
free(ppackage);
}recv_package是對recv的簡單包裝,如果對端異常退出,ppackage是NULL的,再去free,就出問題了。
現(xiàn)在改成:
if(recv_package(sockfd, (struct net_header **)&ppackage, &recv_size) == -1)
{ printf("dispatcher: recv error when waiting judge result.\n"); break; //如果接收失敗,跳出循環(huán)}free(ppackage);當client退出后,dispather也能繼續(xù)運行下去了。
添加回答
舉報
0/150
提交
取消
