udp接收数据时,如果socket没有数据,则函数recvfrom会一直阻塞,那该怎样退出呢?如果用非阻塞方式,可否有一个实例代码。不要mfc下的代码。

解决方案 »

  1.   

    超时,或事件怎么设置?关掉?是不是直接掉用closesocket就好了?我在另外一个线程调用closesocket行么?
      

  2.   

    1.首先将标志位设为Non-blocking模式,准备在非阻塞模式下调用connect函数
    2.调用connect,正常情况下,因为TCP三次握手需要一些时间;而非阻塞调用只要不能立即完成就会返回错误,所以这里会返回EINPROGRESS,表示在建立连接但还没有完成。
    3.在读套接口描述符集(fd_set rset)和写套接口描述符集(fd_set wset)中将当前套接口置位(用FD_ZERO()、FD_SET()宏),并设置好超时时间(struct timeval *timeout)
    4.调用select( socket, &rset, &wset, NULL, timeout )
    返回0表示connect超时
    如果你设置的超时时间大于75秒就没有必要这样做了,因为内核中对connect有超时限制就是75秒。
      

  3.   

    udp链接,不用调用connect,调用了,也报错。
      

  4.   

    使用非阻塞I/O,设置超时值
    int nTime = 5000;
    setsockopt(SOCKET, SOL_SOCKET, SO_RECVTIMEO, (char*)&nTime, sizeof(nTime);
      

  5.   

    select 可以设置超时recvfrom前先select 看select的返回值看是否超时