使用select来确定一个套接字是否可读,当服务器端停止发送数据,但并不关闭套接字时,为什么该套接字仍然是可读呢?而recv的话接收数据长度为0.我得理解是当有数据到达时才变为可读。难道理解错了?

解决方案 »

  1.   

    补充下:
        实现的功能是客户端接收服务器端的报警信息,可能会很长时间没有报警,所以使用select方法来确定套接字是否可读,发现没有报警的时候(这时服务器端是不会发送数据的),套接字还是可读的,但接收的数据长度为0。
      

  2.   

    由一个传递时间参数的数据结构,传递给select,设定一个等待时间间隔后,当等待时间到达或者有数据可读时,select就会返回,这时是非阻塞的,根据你的需要完全可以把这个等待时间设的大一点。
      

  3.   

    msdn如下解释
    For connection-oriented sockets, readability can also indicate that a request to close the socket has been received from the peer. If the virtual circuit was closed gracefully, and all data was received, then a recv will return immediately with zero bytes read. If the virtual circuit was reset, then a recv will complete immediately with an error code such as WSAECONNRESET. The presence of OOB data will be checked if the socket option SO_OOBINLINE has been enabled (see setsockopt).
      

  4.   

    我看客户端可以开一个线程用阻塞模式recv数据 反正是客户端 连接数不会多 
      

  5.   

    感谢楼上各位。虚套接口被“优雅”的终止是个什么意思呢?下面是百度的内容
        readfds参数标识等待可读性检查的套接口。如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成。对其他套接口而言,可读性意味着有排队数据供读取。或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成。如果虚电路被“优雅地”中止,则recv()不读取数据立即返回;如果虚电路被强制复位,则recv()将以WSAECONNRESET错误立即返回。如果SO_OOBINLINE选项被设置,则将检查带外数据是否存在(参见setsockopt())。当检测到套接口可读,但是返回数据为0的话,我不退出while循环,那么后续的报警信息能否正确收到?