有人写过socket I/O模型中的事件模型(WSAEventSelect Model)的程序吗?
我在用WSAEventSelect Model的时候出现了这个问题;
当我的客户端连接服务器端的时候,服务器端的处于侦听的socket(Server)收到一个FD_ACCEPT消息,这是很正常的吧,因为有人要连接。但是紧接着,标识接入的客户端的socket(Client)也收到了一个消息:是FD_WRITE,按照我的代码,这样服务器端的代码就会向客户端send一些东西,但是这是我所不想要的呀!而我的客户端代码除了连接服务器之外什么都没有做。
我想问的是:为什么会在标识客户端的socket上出现一个FD_WRITE消息吗?难道要向客户端发送什么吗?
我在用WSAEventSelect Model的时候出现了这个问题;
当我的客户端连接服务器端的时候,服务器端的处于侦听的socket(Server)收到一个FD_ACCEPT消息,这是很正常的吧,因为有人要连接。但是紧接着,标识接入的客户端的socket(Client)也收到了一个消息:是FD_WRITE,按照我的代码,这样服务器端的代码就会向客户端send一些东西,但是这是我所不想要的呀!而我的客户端代码除了连接服务器之外什么都没有做。
我想问的是:为什么会在标识客户端的socket上出现一个FD_WRITE消息吗?难道要向客户端发送什么吗?
FD_WRITE表示可以向对等端发送数据?
那FD_WRITE还表示什么?
(1)作为客户端的socket,当connect服务器成功后,就会激发FD_WRITE事件.我们可以利用这种机制,在异步连接服务器的情况下,判断客户端socket是否连接成功.
(2)作为服务器通信socket(注意不是监听socket),当客户端socket第一次连接成功后,FD_WRITE便会被激发.同样我们也可以利用这种机制,知道有一个客户端已经连接完成,如果要向它发数据的话就可以发了.
(3)第三种情况和TCP的滑动窗口有关,当发送socket不断填充发送缓冲区(不是应用层的),缓冲区满了返回WSAEWOULDBLOCK,此时应停止发送数据;当发送缓冲区可用了FD_WRITE事件便会激发,此时我们又可以调用send了.对第3种我理解地很浅(也不打算深入理解).
个人感觉没有必要把FD_WRITE应用得很复杂,我以前用FD_WRITE机制实现了文件传输;为什么要用FD_WRITE呢,其实我不为什么就是觉得FD_WRITE挺有意思的.所以现在不用了.
我觉得你的理解好深刻呀,有没有这方面的详细资料呢?
谢谢你的答复