2. 传输数据
在重叠 I/O 模型中,传输数据的函数是 WSASend、WSARecv(TCP)和 WSASendTo、
WSARecvFrom 等。下面是 WSASend 函数的定义,其他函数与之类似。
WINSOCK_API_LINKAGE int WSAAPI WSARecv (
SOCKET s, // 套接字句柄
LPWSABUF lpBuffers, // WSABUF 结构的数组
// 每个WSABUF结构包含一个缓冲区指针和对应缓冲区的长度
DWORD dwBufferCount, // 上面 WSABUF 数组的大小
LPDWORD lpNumberOfBytesRecvd, // 如果 I/O 操作立即完成的话,此参数取得实际传输数据的字节数
LPDWORD lpFlags, // 标志
LPWSAOVERLAPPED lpOverlapped, //与此I/O操作关联的WSAOVERLAPPED结构
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // 指定一个完成例程
);
这些函数与 Winsock1 中的 send、recv 等函数相比,都多了如下两个参数。
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
I/O 操作函数都接收一个 WSAOVERLAPPED 结构类型的参数。这些函数被调用之后会 立即返回,它们依靠应用程序传递的 WSAOVERLAPPED 结构管理 I/O 请求的完成。应用程 序有两种方法可以接收到重叠 I/O 请求操作完成的通知:
(1)在与 WSAOVERLAPPED 结构关联的事件对象上等待,I/O 操作完成后,此事件对 象受信,这是最经常使用的方法。
(2)使用 lpCompletionRoutine 指向的完成例程。完成例程是一个自定义的函数,I/O 操 作完成后,Winsock 便去调用它。这种方法很少使用,将 lpCompletionRoutine 设为 NULL 即 可。
下一小节将详细讨论如何使用第一种方法接收网络事件通知。