IOCP和SetFileCompletionNotificationModes

 

在WinSock的IOCP模式中,调用WSASend/WSARecv/WSASendTo/WSARecvFrom等函数发送接受数据。调用WSAxxx函数发送或者接受数据时,如果函数返回了0,表示操作已经立即完成了。但是一般不会在这时进行完成操作的处理,因为Socket已经和完成端口绑定,某个调用GetQueuedCompletionStatus/GetQueuedCompletionStatusEx函数的线程一定会得到这个完成通知;此时处理了,下次得到通知时还需要把它和其它正常的通知区分开来,是自找麻烦。

对于某些UDP服务器程序,比如DNS服务器,处理的都是比较小的报文,大多数情况下操作都是可以立即完成的,没有必要下次得到完成端口的通知时再处理。有没有办法不让完成端口通知那些立即完成的操作呢?正好有这么一个函数可以满足需要:SetFileCompletionNotificationModes。SetFileCompletionNotificationModes函数可以在一个句柄上设置一个标记:FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,如果一个句柄设置了这个标记,在操作立即完成时,IO管理器就不会在句柄关联的完成端口上添加完成通知。

可以这个函数只有在Vista之后才支持。SetFileCompletionNotificationModes内部调用了ZwSetInformationFile,指定的第五个参数FILE_INFORMATION_CLASS是41(FileIoCompletionNotificationInformation),而FileIoCompletionNotificationInformation这个class在Windows 2000/XP/2003是不支持的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值