使用Winsock Non-block模式的时候,我们有多少种方法进行异步接收?总共4种!
1. 使用WSAAsyncSelect:
使用该方法可以指定两种模式,一种是事件通知,另外一种是窗口通知。就是有数据的时候通知上层进行接收。这个是在Windows上面使用最多的。
2. 创建线程使用select模式:
这个方法的好处是标准接口,基本在系统之间不需要怎么移植,但是实际使用起来还是有点麻烦的,而且在Windows上面是效率最低的一种。
3. 使用完成端口:
完成端口是效率最高的一种方式,可以省掉很多内存拷贝。因为WIndows的协议栈里面分了很多层,要一层层的拷贝数据,如果使用完成端口就可以省略了。完成端口的原理是,用户传一个指针下去,然后等缓冲里面被写满了数据后通过event通知。这个方法其实实现起来的代码也很精炼哦!98不支持完成端口。
4. 使用Overlap的模式,就是WSARecv最后的OVERLAP参数传一个EVENT进去,等数据填满之后会触发EVENT;可惜的是这个方法内存还是会一层一层拷贝的。效率不算最高,代码写法和完成端口类似。