记得在使用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事件,告诉系统将有数据要发送。
發送完成后再設定WSAEventSelect(socks, event, FD_READ );
1)使用 Connect 或者 WSAConnect ,一个套接字首次建立了连接时(指服务端)
2)使用 accept 或者 WSAAccept ,套接字被接收后 (指客户端)
3)缓冲区满之后,又出现缓冲区有可用空间时 (服务端或者客户端)注意:第三个条件是由两个条件组成:
1)缓冲区曾经满过
2)缓冲区又有了空间
WSAAsyncSelect(socks, hWnd,WM_SOCKET, FD_WRITE | FD_CLOSE),
如果缓冲区有可用空间,也会触发 FD_WRITE 事件。我想,WSAEventSelect模型也应该是差不多的吧。我一开始也是用一楼的方法做的,但只触发了第一次的 FD_WRITE 事件,以后无论怎么调用,它都不再触发了,不知道是什么原因。