zoukankan      html  css  js  c++  java
  • 非阻塞SOCKET套接字connect等待时间的实现

     SOCKET cClient;
        cClient=socket(AF_INET,SOCK_STREAM,0);
        //设置为非阻塞套接字
        int iMode = 1;
        ioctlsocket(cClient, FIONBIO, (u_long FAR*)&iMode);
        //定义服务端
        SOCKADDR_IN saddr;
        saddr.sin_addr.S_un.S_addr=inet_addr(CMT->iplist[i]);
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(5001);
        //超时时间
        struct timeval tm;
        tm.tv_sec  = 3;  //3秒
        tm.tv_usec = 0;
        int ret = -1;
        //非阻塞操作
        // 尝试去连接服务端
        if (!connect(cClient, (SOCKADDR*)&saddr, sizeof(saddr)))
        {
         ret = 1; // 连接成功
        }
        else
        {
         fd_set set;
         FD_ZERO(&set);
         FD_SET(cClient, &set);
         if (select(-1, NULL, &set, NULL, &tm) <= 0)
         {
          ret = -1; // 有错误(select错误或者超时)
          //continue;//循环发送SOCKET时continue
         }
         else
         {
          int error = -1;
          int optLen = sizeof(int);
          getsockopt(cClient, SOL_SOCKET, SO_ERROR, (char*)&error, &optLen);
          if (0 != error)
          {
           ret = -1; // 有错误
           //continue;//循环发送SOCKET时continue
          }
          else
          {
           ret = 1;  // 无错误
          }
         }
        }
        // 设回为阻塞socket
        //iMode = 0;
        //ioctlsocket(cClient, FIONBIO, (u_long FAR*)&iMode); //设置为阻塞模式
        if (ret==1)
        {
         send(cClient,buffer,1024,0);
         recv(cClient,buffer,1024,0);
         closesocket(cClient);
        }
        closesocket(cClient);
  • 相关阅读:
    一个翻译小程序(带一点点抒情)
    前线解释多线程《二》
    一周杂记(MVC 图片上传)
    MVC杂记<>路由
    MVC杂记<三>Controller
    201920201学期20192412《网络空间安全专业导论》第二周学习总结
    201920201学期20192412《网络空间安全专业导论》第一周学习总结
    命令行执行php脚本 中$argv和$argc
    搭建lnmp教程
    php中static 静态关键字
  • 原文地址:https://www.cnblogs.com/xuandi/p/5362498.html
Copyright © 2011-2022 走看看