【网络编程】之十、重叠IO Overlapped IO
winsock2 中引入了重叠I/O(Overlapped I/O)的概念并且要求所有的传输协议提供者都支持这一功能。 他的功能高于前面我们提过的三种,但是最强悍的还是我们后面要说的完成端口。
基本原理:让应用程序使用一个重叠的数据结构,一次投递一个活多个winsock I/O请求,针对那些提交的清酒,在他们完成之后,应用程序可为他们提供服务。 应用程序可通过ReadFile和WriteFile两个函数执行I/O操作。 要注意:重叠I/O仅能在由WSASocket函数打开的套接字上使用。要想在一个套接字上使用重叠I/O,首先必须使用 WSA_FLAG_OVERLAPPED 这个标志。
BOOL AcceptEx( __in SOCKET sListenSocket,//一个监听套接字 __in SOCKET sAcceptSocket,//指定另一个套接字,负责对进入连接请求的“接受” __in PVOID lpOutputBuffer,//指定一个特殊的缓冲区,因为要负责三种数据的接收,服务器的本地地址,客户端的远程地址和新建连接上发送的第一个数据块。 __in DWORD dwReceiveDataLength,//以字节为单位,指定在lpOutputBuffer缓冲区中,保留多大的空间来接收数据。 如果传0,那么就不会再接收任何数据了。 __in DWORD dwLocalAddressLength,// __in DWORD dwRemoteAddressLength,//和上一个参数以字节为单位指定在lpOutputBuffer缓冲区中,保留多大空间,在一个套接字被接受的时候,用于本地和远程地址信息的保存 __out LPDWORD lpdwBytesReceived,//用于返回接收到的实际数据量,以字节为单位。只有在以同步方式完成的前提下,才会设置这个参数。 __in LPOVERLAPPED lpOverlapped//对应的是一个OVERLAPPED结构,允许AcceptEx以一种异步方式工作。 前面说过,只有在一个重叠I/O应用中,这个函数才需要使用事件对象通知机制。);要知道AcceptEx函数只能由这里给大家说的“事件通知”方式获取异步I/O请求的结果,在"完成例程”中是无法使用的。
下面将讲述完成端口,那个更加高效,但是也更加困难;
2012/9/2
jofranks 于南昌