• 如何判断SOCKET还是连接着的


    转自 http://blog.csdn.net/loadstar_kun/article/details/5790407

    1. 用read函数来判断

    读到长度0不能断定是已经断开.除非是-1,才代表输入流已经被关闭,说名socket已经close,而且关键在于你怎么读,实际上应该是一个单独的线程一直在读,因为你无法预先知道能不能一次将发过来的包读完,也无法知道一次是不是读完整了包,所以线称一直循环在读并且一直在解包.这样即能知道什么时候server断,也完成了消息的解读,我的方案是这样的,在大数据量高速率网络上运行没有发生过丢包

    // 判断是否连接

    char ch = 'A';

    if (read(g_sockfd, &ch, 1)<=0)

    {

    if (connect(g_sockfd,(struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr) ) == 0)

            {

                      ServiceLog.write_log("[NotifyDAU]:connect to DAU  success.");

            }

             else

             {

                       ServiceLog.write_log("[NotifyDAU]:can't connect to DAU ");

                       return;

             }

    }

    用try{}catch{}是比较合适。

    当他是连着的,当进行通讯时发生异常后就知道了.

    当你不断的read的时候,server断,exception就catch到了。

    2. 心跳包

    可不可以在Client设一个定时器,每隔一段时间发一条消息给服务器,看能不能收到服务器的响应。

    心跳包就是定时发包,没回应就判断断开。

    3. getsockopt

    int optval, optlen = sizeof(int);

    getsockopt(sd, SOL_SOCKET, SO_ERROR,(char*) &optval, &optlen);

    switch(optval){

          case 0:

            //“处于连接状态“          

            break;    

          case ECONNREFUSED:

          case EHOSTNUMREACH:

    }

    4. 项目中使用的情况

    // 判断是否连接

    int optval, optlen = sizeof(int);

    int r = getsockopt(g_sockfd, SOL_SOCKET, SO_ERROR,(char*) &optval, &optlen);

    // send HELLO 包

    if ((optval == 0) && (r == 0) && (send(g_sockfd,(char*)&g_DAUCommand,sizeof(struct _DAUCommand),0) != SOCKET_ERROR ))

    {

    ServiceLog.write_log("[threadOperationWaitTrasferAgain]: try to recv from dau...");

             length = recv(g_sockfd,(char *)&command,sizeof(struct _DAUCommand),0);

    }

    else

    {

             if (connect(g_sockfd,(struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr) ) == 0)

             {

                      ServiceLog.write_log("[threadOperationWaitTrasferAgain]:connect to DAU  success.");

                       ServiceLog.write_log("[threadOperationWaitTrasferAgain]: try to recv from dau...");

                       length = recv(g_sockfd,(char *)&command,sizeof(struct _DAUCommand),0);

             }

             else

             {

                       ServiceLog.write_log("[threadOperationWaitTransferAgain]:can't connect to DAU, try again ");

                       length = 0;

                       continue;

             }

    }

  • 相关阅读:
    英语cabardine麝香cabardine单词
    英语dialogite红纹石dialogite菱锰矿
    英语chiltonite葡萄石chiltonite单词
    英语chrysopal金绿宝石chrysopal单词
    Android系统默认对话框添加图片
    入门rocketmq从浅到深
    通用mapper认识和用法
    java开发注解大全
    solr的认识、linux下安装、java下使用(含下载资源)
    RSA签名和验签Util
  • 原文地址:https://www.cnblogs.com/XiHua/p/3683109.html
Copyright © 2020-2023  润新知