5).重叠I/O模式(overlapped)
常用函素:
1.WSASocket : 创建套接字
2.TCP
WSASend
WSARecv
3.UDP:
WSASendTo
WSARecvFrom
4.AccepEx (Mswsock.lib库导出)
WSAIoctl
5.数据类型
WSAOVERLAPPED (wsaoverlapped)
函数: WSAGetOverlappedResult
使用:
缓冲区对象
typedef struct _BUFFER_OBJ
{
OVERLAPPED ol; // 重叠结构
char *buff; // send/recv/AcceptEx所使用的缓冲区
int nLen; // buff的长度
PSOCKET_OBJ pSocket; // 此I/O所属的套节字对象
int nOperation; // 提交的操作类型
#define OP_ACCEPT 1
#define OP_READ 2
#define OP_WRITE 3
SOCKET sAccept; // 用来保存AcceptEx接受的客户套节字(仅对监听套节字而言)
_BUFFER_OBJ *pNext;
} BUFFER_OBJ, *PBUFFER_OBJ;
1.定义全局数据
HANDLE g_events[WSA_MAXIMUM_WAIT_EVENTS]; // I/O事件句柄数组
int g_nBufferCount; // 上数组中有效句柄数量
PBUFFER_OBJ g_pBufferHead, g_pBufferTail; // 记录缓冲区对象组成的表的地址
2.申请缓冲区
PBUFFER_OBJ GetBufferObj(PSOCKET_OBJ pSocket, ULONG nLen)
3. 释放缓冲区
void FreeBufferObj(PBUFFER_OBJ pBuffer)
4.根据受信事件对象的句柄,查找对应的BUFFER_OBJ
PBUFFER_OBJ FindBufferObj(HANDLE hEvent)
5.更新事件句柄数组g_events
void RebuildArray()
6.接收发送
接收连接的BUFFER_OBJ对象.使用的函数: PostAccept
接收数据的BUFFER_OBJ对象.使用的函数: PostRecv
发送数据的BUFFER_OBJ对象.使用的函数: PostSend
实现步骤:
1. 设置I/O类型,增加套节字上的重叠I/O计数
2. 投递此重叠I/O
7.I/O请求完成之后, 处理它的函数是HandleI/O
8.main主函数
a)创建监听套接字.投递监听I/0
b)循环处理I/0事件
整理自(Windows网络与通信程序设计, 王艳平)
代码地址: http://download.csdn.net/detail/zhaoyc_59211/192329