在使用WinSock的WSAEventSelect()函数时,什么情况下会收到FD_CLOSE消息?是否接收到对方发的FIN包?若此时缓冲中数据未读完,可以继续读么?

解决方案 »

  1.   

    对方的Socket连接关闭断开后就会收到FD_CLOSE,收到FD_CLOSE的时候其实你已经读完了缓冲中的数据了。
      

  2.   


    对方关闭了socket或你自己关闭了socket,如果你的socket关联上了FD_CLOSE的话,都会触发到FD_CLOSE消息的.现在只讨论是对方关闭了(如果是你自己关闭的话,当然是你数据都读好了才关闭了).
    如果对方在将发送发送完成(send()或WSASend()返回成功结果),就马上关闭socket的话,那么会出现多种情况
    1.假设对方发送的数据并不是大得惊人,只是一般的几K到10多KB:
    A.当你的数据都接收完后,FD_CLOSE消息才被触发,一般出现在非局域网环境,你到对方的网络环境速度一般时.
    B.收到FD_CLOSE消息,但数据还没到达,这最大可能出现是在同一个局部网环境中,或你到对方的网络速度很快时.2.假设对方发送的数据比较大,例如是100KB以上,那么无论在哪种环境,很多机率在收到FD_CLOSE时还没将所有数据接收完.无论是哪种情况,你最保险的方法是在收到FD_CLOSE时,先检查socket中是否还有收据可读,如果无数据可读了,那自然是直接关闭socket了,如果还是有数据可读,那么就继续读,直至socket中没有数据可读后才将socket关闭.