`
wx1568444409
  • 浏览: 14554 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

非阻塞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);

转载于:https://my.oschina.net/Thekillersohot/blog/699591

分享到:
评论

相关推荐

    linux客户端Socket非阻塞connect编程[归纳].pdf

    2. 建立 socket 套接字,并将其设置为非阻塞模式。 3. 建立 connect 连接,并将 errno 设置为 EINPROGRESS,表示 connect 操作正在进行。 4. 使用select 函数等待 connect 操作的完成。 5. 在 connect 操作完成后,...

    linux客户端Socket非阻塞connect编程收集.pdf

    2. 建立 socket 套接字,并将其设置为非阻塞模式。 3. 建立 connect 连接,此时 socket 设置为非阻塞,connect 调用后,无论连接是否建立立即返回 -1,同时将 errno 设置为 EINPROGRESS。 4. 使用 select 函数等待...

    windows下设置socket的connect超时

    4. **Select函数**:用于检测一个或多个套接字的活动状态,即是否有数据可以读取、写入或发生错误等。 ### 二、实现步骤 接下来,我们将根据给定的描述中的六个步骤,逐一解析如何在Windows环境下设置socket连接...

    C++ TCP客户端非阻塞连接超时测试源码

    程序可能使用了套接字API(如`socket()`, `fcntl()`, `connect()`, `select()`等)来创建、配置和管理套接字,以及处理连接请求。 在实现非阻塞连接超时时,开发者通常会使用以下步骤: 1. 创建套接字:使用`...

    套接字之详解SOCKET.doc

    6. `select()`函数是多路复用器,可以同时检查多个套接字的状态,用于非阻塞I/O。它需要文件描述符集合、超时时间等参数。 7. 最后,`closesocket()`函数用于关闭套接字,释放资源。 面向连接的套接字系统调用通常...

    linux下使用epoll基于socket套接字的通信库。.zip

    - 使用非阻塞模式:配合`fcntl()`函数设置套接字为非阻塞模式,避免因等待数据而阻塞线程。 - 边缘触发(ET)模式:相比于水平触发(LT),边缘触发更高效,但需要更精细的事件处理。 通过以上知识,你可以创建一...

    VC套接字阻塞模式开发

    - 非阻塞模式需要复杂的事件驱动编程,如I/O复用(select、poll、epoll等)或异步I/O(WSAAsyncSelect、WSAEventSelect)来处理多个套接字的读写事件。 3. **VC++中的Winsock**: - 使用Winsock时,开发者需要...

    QTcpSocket通信编程时阻塞与非阻塞的问题 - findumars - 博客园1

    QTcpSocket是Qt库中的一个类,用于处理TCP(传输控制协议)套接字通信。在QTcpSocket的编程中,我们经常会遇到阻塞和非阻塞两种模式的选择。这两种模式在处理网络通信时有着不同的行为和应用场景。 首先,阻塞模式...

    用原始套接字结合fstream的vc文件传输程序

    - **套接字编程**:涉及socket()函数创建套接字,bind()绑定端口,listen()开始监听,accept()接受连接,connect()建立连接,send()和recv()发送与接收数据。 - **多线程处理**:为了提高服务器的并发能力,可以考虑...

    Socket长连接demo

    Socket,又称套接字,是网络通信的基本单位,提供了进程间、网络间进程通信的一种接口。本示例可能是一个关于如何实现和管理Socket长连接的代码演示。 在TCP/IP协议族中,Socket分为两种类型:短连接(Short-lived ...

    同步套接字客户端

    2. **非阻塞I/O**:使用`fcntl()`或`ioctl()`设置套接字为非阻塞模式,当没有数据可读或写时,`recv()`和`send()`不会阻塞,而是立即返回。 3. **I/O复用**:利用`select()`, `poll()`, 或 `epoll()`等机制监控多个...

    Blocking_Socket_File.zip_blocking socket

    1. **套接字API**:了解`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`等套接字函数的使用是基础。这些函数在进行阻塞式通信时起到关键作用。 2. **阻塞与非阻塞的区别**:阻塞式...

    Winsocket入门教程二:非阻塞式服务器和客户端程序TCP.doc

    * exceptfds 表示错误套接字的集合,错误套接字在两种情况下有信号出现:一、集合中的套接字经过 connect 操作后,连接失败;二、有带外数据到来。 非阻塞式服务器和客户端程序可以避免阻塞式服务器和客户端程序的...

    select实现的socket程序

    1. **套接字的非阻塞设置**:为了配合`select`,我们通常需要将套接字设置为非阻塞模式,通过`fcntl`函数实现。这使得在没有数据可读或无法写入时,套接字调用不会阻塞。 2. **准备文件描述符集**:使用`FD_ZERO`...

    基于Socket的网络编程技术及其实现(pdf)

    - 通过设置Socket为非阻塞模式,可以在没有数据可读写的情况下立即返回,避免长时间等待。 **4.3 超时设置** - 设置Socket的读写超时时间,防止长时间等待导致的资源浪费。 #### 五、总结 Socket作为一种基础的...

    socket 堵塞

    此外,还可以使用非阻塞Socket或选择套接字选项SOCK_NONBLOCK,但这需要更复杂的编程模型来处理可能的EAGAIN或EWOULDBLOCK错误,因为它们表示操作无法立即完成。 总结来说,"socket堵塞"是指在阻塞模式下,Socket...

    Socket常用函数大全

    `ioctlsocket()`函数提供了一种机制来控制套接字的行为,如设置非阻塞模式、获取套接字状态等。它是进行高级网络编程的重要工具。 ### listen() `listen()`函数用于将一个未连接的套接字转换为监听套接字,使其...

    C++ socket编程

    11. **异步编程**:C++11引入了异步I/O模型,可以使用`std::async`、`std::future`和`std::promise`等工具实现非阻塞的套接字操作。 12. **套接字选项**:`setsockopt()`和`getsockopt()`函数可以设置和获取套接字...

    linux_多线程无阻塞socket.zip_linux_linux socket tcp_tablep1c_tcp+线程_tc

    在Linux系统中,Socket接口是基于Berkeley套接字标准的,提供了丰富的API供开发者使用,如`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, 和 `recv()`等。 TCP(Transmission Control ...

Global site tag (gtag.js) - Google Analytics