zoukankan      html  css  js  c++  java
  • 如何判断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;

             }

    }

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/XiHua/p/3683109.html
Copyright © 2011-2022 走看看