• 非阻塞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);
  • 相关阅读:
    c# 操作数据库
    dataview findrows
    C++:gethostname,gethostbyname获取IP地址和计算机名
    MQTT
    STM32操作外部SRAM
    JAVA中最常用的快捷键总结
    Zstack中End Device设备失去父节点时的重新入网处理方法(转)
    VC++ 重叠窗口
    (转载)PLC内部电路常见的几种形式
    VS2005 DoModal函数
  • 原文地址:https://www.cnblogs.com/xuandi/p/5362498.html
Copyright © 2020-2023  润新知