Windows网络编程——完成端口的实现(待补充,完善)
时间:2010-10-16 来源:%Weed%
select(选择);
WSAAsyncSelect(异步选择模型);
WSAEventSelect(事件选择模型);
Overlapped(重叠);
completion port(完成端口);
以下记叙的是完成端口的实现步骤:(相关函数s参数说明,详见MSDN)
1.使用函数HANDLE CreateIoCompletionPort(...)创建一个完成端口句柄;
例:HANDLE hIocp=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
2.创建一个套接字并绑定好地址和端口
例: int port=6666;
sockaddr_in localAddr={0};
SOCKET iocpSocket=socket(AF_INET,SOCK_DGRAM,0);
localAddr.family=AF_INET;
localAddr.port=htons(port);
localAddr.sin_addr.S_un.S_addr=INADDR_ANY;
bind(iocpSocket,(sockaddr*)&localAddr,sizeof(sockaddr*));
3.将套接字与完成端口绑定
例:
ULONG iocpKey=11; //与套接字关联的键
HANDLE tmpHIocp=CreateIoCompletionPort((HANDLE)iocpSocket,hIocp,iocpKey,0); // 返回的HANDLE tmpIocp应与hIocp值一样;
4.套接字重叠操作
使用函数int WSARecvFrom(...)执行重叠操作,重叠成功后函数返回值为SOCKET_ERROR,使用WSAGetLastError()的值为WSA_IO_PENDING;
注意附给WSARecvFrom的第四个参数LPDWORD lpFlags变量应附值为0再取地址传递,否则重叠失败。
5.创建工作线
在工作线程中使用BOOL GetQueuedCompletionStatus(...)或取套接字接收的数据及相关信息;