Maison  >  Questions et réponses  >  le corps du texte

linux - Socket TCP连接 一端异常退出导致另一端退出

linux环境下用C写了一个程序socket程序,实现功能如下:

一个dispatcher,多个client,dispatcher向client分发任务,client完成后,将结果返回给dispatcher,dispatcher与client通过tcp连接

问题是 当其中一个client异常退出后,会导致dispathcer也退出。如何能够在某个client异常退出后,dispatcher打印出相关信息,同时能够继续运行下去?

巴扎黑巴扎黑2743 Il y a quelques jours813

répondre à tous(4)je répondrai

  • 天蓬老师

    天蓬老师2017-04-17 11:09:19

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

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

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

    répondre
    0
  • 阿神

    阿神2017-04-17 11:09:19

    估计和我回答的这个问题类似,你先看下有没有用
    http://segmentfault.com/q/10100000001...

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 11:09:19

    dispatcher端可以考虑用多进程/多线程实现

    répondre
    0
  • 黄舟

    黄舟2017-04-17 11:09:19

    可能我的问题描述过于简单,又没有贴代码,自己重新看了下代码,发现了问题,之前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也能继续运行下去了。
    谢谢各位~

    répondre
    0
  • Annulerrépondre