zoukankan      html  css  js  c++  java
  • connect调用超时的实现方式

      第二种更通用的、使connect调用超时的方法是使套接字成为无阻塞的,然后用select等待它完成。这种方法避免了使用alarm时遇到的很多问题,但我们必须承认,即使是在UNIX实现中,这种方法还是存在很多可移植性问题。

    int main(int argc, char **argv)

    {

      fd_set rdevents;

      fd_set wrevents;

      fd_set exevents;

      struct sockaddr_in peer;

      struct timeval tv;

      SOCKET s;

      int flags;

      int rc;

      INIT();

      set_address(argv[1], argv[2], &peer, "tcp");

      s=socket(AF_INET,SOCK_STREAM,0);

      if(!isvalidsock(s))

        error(1,errno,"socket call failed");

      if((flags=fcntl(s,F_GETFL,0)) <0)

        error(1,errno,"fcntl(F_GETFL) failed");

      if((rc = connect(s,(struct sockaddr *)&peer,

        sizeof(peer))) && errno != EINPROGRESS)

        error(1,errno,"connect failed");

      if(rc == 0)

      {

        if(fcntl(s,F_SETFL,flags) < 0)

          error(1,errno, "fcntl(restore flags) failed");

        client(s,&peer);

        EXIT(0);

      }

      FD_ZERO(&rdevents);

      FD_SET(s,&rdevents);

      wrevents = rdevents;

      exevents = rdevents;

      tv.tv_sec = 5;

      tv.tv_usec = 0;

      rc = select(s+1, &rdwvents, &wrevents, &exevents, &tv);

      if(rc < 0)

        error(1,errno, "select failed");

      else if(rc == 0)

        error(1,0, "connect timed out ");

      else if(isconnected(s,&rdevents, &wrevents, &exevents))

      {

        if(fcntl(s, F_SETFL, flags) < 0)

          error(1 errno, "fcntl(restore flags) failed");

        client(s,&peer);

      }

      else

        error(1,errno, "connect failed");

      EXIT(0);

    }

    int isconnected(SOCKET s,fd_set *rd, fd_set *wr, fd_set *ex)

    {

      int err;

      int len=sizeof(err);

      errno = 0;

      if(!FD_ISSET(s, rd) && !FD_ISSET(s, wr))

        return 0;

      if(getsockopt(s,SOL_SOCKET,SO_ERROR,&err,&len) < 0)

        return 0;

      errno = err;

      return err == 0;

    }

  • 相关阅读:
    题型:系统可靠性
    计算机基础——网络存储
    传输层——TCP的流量控制服务
    传输层——UDP和TCP的对比
    配置——VLAN
    项目管理——PERT图
    从“派生类不能访问基类对象的protected成员”开始讨论各类成员的“可见性”
    cin.clear()和cin.sync
    华为编程大赛——路径查找
    华为编程大赛——求表达式的值
  • 原文地址:https://www.cnblogs.com/405845829qq/p/4180440.html
Copyright © 2011-2022 走看看