Winsock2中WSAAsynSelect()模型各种事件的触发条件

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 loleeve 的 blog

使用wsaasynselect()模型的关键是要搞清楚各种事件的触发条件,不然会造成读或写数据混乱。
这些事件的触发条件同样适用于casyncsocket

=======================
[1]fd_read事件触发条件:
1.在数据到达socket后,并且从来没有触发过fd_read(也就是最开始的阶段)
2.在数据到达socket后,并且前一个recv()调用后
3.调用recv()后,缓冲区还有未读完的数据

第3点过程如下:
1.100 bytes 数据到达,winsock2发出fd_read
2.程序用recv()只读入50 bytes,还剩下50 bytes
3.winsock2继续发出fd_read消息

recv()返回wsaewouldblock的情况:
1.有数据到达,fd_read触发,该消息加入程序的消息队列
2.在还没处理该消息前,程序就把数据recv()了
3.等到处理该fd_read消息时,程序调用recv()就会返回wsaewouldblock(因为数据在这之前就recv()了)

注意:
1.winsock2发出一个fd_read后,如果程序没有用recv(),即使还有数据没接收fd_read也不会再触发另一个fd_read,要等到recv()调用后fd_read才会发出。
2.对一个fd_read多次recv()的情形:如果程序对一个fd_read多次recv()将会造成触发多个空的fd_read,所以程序在第2次recv()前要关掉fd_read(可以使用wsaasynselect关掉fd_read),然后再多次recv()。
3.recv()返回wsaeconnaborted,wsaeconnreset...等消息,可以不做任何处理,可以等到fd_close事件触发时再处理

=====================
[2]fd_accept事件触发条件:
1.当有请求建立连接,并且从来没有触发过fd_accept(也就是最开始的阶段)
2.当有请求建立连接,并且前一个accept()调用后

注意:当fd_accept触发后,如果程序没有调用accept(),即使还有建立连接的请求fd_accept也不会触发,要直到accept()调用后

========================
[3]fd_write事件触发条件:
1.第一次connect()或accept()后(即连接建立后)
2.调用send()返回wsaewouldblock,并且直到发送缓冲区准备好(为空)后

注意:当前一次调用send()没有返回wsaewouldblock时,如果缓冲区准备好了,也不会触发fd_write的

========================
[4]fd_close事件触发条件:自己或对端中断连接后
注意:closesocket()调用后fd_close不会触发

========================
[5]fd_connect事件触发条件:调用了connect(),并且连接建立后。

详细参考msdn

本文关键:Winsock2中WSAAsynSelect()模型各种事件的触发条件
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top