记得在使用WSAAsyncSelect时,可以先将数据存入缓冲区,然后调用WSAAsyncSelect(socks, hWnd, WM_SOCKET, FD_WRITE | FD_CLOSE),如发送缓冲区有空闲,则会触发FD_WRITE,执行其中的send函数。但在使用WSAEventSelect模型时,在connect成功后,只触发了一次FD_WRITE事件,之后无论如何调用WSAEventSelect(socks, event, FD_WRITE | FD_CLOSE),都无法再次触发此事件。但调用WSAEventSelect(socks, event, FD_READ | FD_CLOSE),FD_READ事件却能正常触发。我的send函数是写在FD_WRITE事件中的。请问,在使用WSAEventSelect模型时,怎样才能手动触发FD_WRITE事件,告诉系统将有数据要发送。

解决方案 »

  1.   

    每次有數據要發送時都要執行WSAEventSelect(socks, event, FD_WRITE )
    發送完成后再設定WSAEventSelect(socks, event, FD_READ );
      

  2.   

    三种条件下,才会发出 FD_WRITE 事件通知。
    1)使用 Connect 或者 WSAConnect ,一个套接字首次建立了连接时(指服务端)
    2)使用 accept 或者 WSAAccept ,套接字被接收后 (指客户端)
    3)缓冲区满之后,又出现缓冲区有可用空间时 (服务端或者客户端)注意:第三个条件是由两个条件组成:
    1)缓冲区曾经满过
    2)缓冲区又有了空间
      

  3.   

    sorry,1)、2)后面的 “服务端”、“客户端”写反了。
      

  4.   

    我知道以上三中触发条件。但在WSAAsyncSelect中,调用
    WSAAsyncSelect(socks, hWnd,WM_SOCKET, FD_WRITE | FD_CLOSE),
    如果缓冲区有可用空间,也会触发 FD_WRITE 事件。我想,WSAEventSelect模型也应该是差不多的吧。我一开始也是用一楼的方法做的,但只触发了第一次的 FD_WRITE 事件,以后无论怎么调用,它都不再触发了,不知道是什么原因。