WSAAsyncSelect注意的地方

使用WSAAsyncSelect函数注意的地方

1.调用该函数后,套接字被设备子为非阻塞模式,要想恢复为阻塞模式,必须再次调用该函数,取消掉注册过的事件,再调用ioctlsocket 设为阻塞模式。

2.消息函数的wParam参数为事件发生的套接字,LParam对应错误消息和相应的事件,可以调用宏WSAGETSELECTERROR(lParam),WSAGETSELECTEVENT(lParam)。

3.多次调用WSAAsyncSelect函数在同一个套接字上注册不同的事件(多次调用采用同样或者不同样的消息),最后一次调用将取消掉前面注册的事件。

4.使用accept()函数建立的套接字与监听套接字具有同样的属性,也就是说,在监听套接字上注册的事件同样会应用于建立连接的套接字,但是我们一般会在监听套接字建立连接后重新为其注册事件。

5.为一个FD_READ网络事件不要多次调用recv()函数,如果应用程序为一个FD_READ网络事件调用多个recv()函数,会使得该应用程序收到多个FD_READ网络事件。应用程序不必再受到FD_READ消息时,读取所以可读的数据,每收到一次网络事件,调用一次recv()函数是恰当的。

6.使用FD_CLOSE事件来判断套接字是否已经关闭,错误代码指示套接字是从容关闭还是硬关闭,错误码为0,代表从容关闭,若错误码为WSAECONNERESET,则为硬关闭。如果套接字从容关闭,数据全部接收,应用程序会收到FD_CLOSE指出虚电路关闭,它不会收到FD_READ消息来表明这个状态,调用closesocket()不会投递FD_CLOSE事件。

发生网络事件的条件

1.FD_READ。

  • 调用recv或者recvfrom函数后,仍然有数据可读。
  • 调用WSAAsyncSelect有数据可读。

2.FD_WRITE

  • 当调用WSAAsyncSelect函数时,如果调用能够发送数据。
  • 调用connect或者accept函数后,当连接已经建立时。
  • 调用send或者sendto,返回WSAWOULDBLOCK错误码,再次调用send或者sendto函数可能成功时。

3.FD_CLOSE

  • 当调用WSAAsyncSelect函数时,套接字连接关闭时。
  • 对方执行从容关闭后,没有数据可读时,如果数据已经到达并等待读取,FD_CLOSE事件不会被发送,直到所有数据都被接收。
  • 调用shutdown函数执行从容关闭,对方应答FIN后,此时无数据可读。
  • 对方结束了连接,并且lparam包含WSAECONNRESET错误时。

优势

该模型的优势在于使用了基于windows消息的处理方式,FD_CLOSE消息保证了数据全部接受,从容关闭客户端和服务端的连接。

不足

必须建立窗口,调用WSAAsyncSelect函数后,套接字被设为非阻塞模式,相关调用不一定能成功返回,必须要对相关调用的返回做处理。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值