??xml version="1.0" encoding="utf-8" standalone="yes"?>
Win32重叠I/O(OverLapped I/O)的机制允许发起一个操作,然后在操作完成之后接受到信息。对于U需要很长时间才能完成的操作来说重叠操作Q有着很重要的意义。我们可以在发v一个操作后Q在监听U程中等待操作完成,而主U程可以做其他的事情?br /> 在Win2000上,提供的可扩展的I/O模型是使用完成端口。完成端口对在Windows的内部做了优化,提供了更高的效率?br /> 可以把完成端口看成一个系l维护的队列Q操作系l将完成的重叠操作通知消息攑ֈ完成端口队列Q由于暴霜y操作完成”,所以命名ؓ“完成端口”?br /> 应用完成端口的步骤:
1.创徏完成端口句柄Q?br /> HANDLE hIocp;
hIocp=CreateCompletiom(
INVALID_HANDLE_VALUE,
NULL,
(ULONG_PRT)0,
0);
if( hIocp == NULL){
//创徏p|?br /> }
2.兌SOCKET 描述W与完成端口句柄
SOCKET s;
s=socket(AF_INET,SOCKE_STREAM,0);
if (s == INVALID_SOCKET){
///SOCKET 创徏p|处理
}
if( CreateCompletionPort((HANDLE)s, hIocp,(ULONG_PRT)0,0) == NULL){
//兌p|
}
3.创徏监听U程.Q 监听线E可以创建多个,Ҏ具体需要而定?br /> CreateThread(CoPortThread,......);
4.监听U程函数Q?br /> DWORD CoPortThread(LPVOID lpParam){
while(true){
bResult = GetQueuedCompletionStatus(ghCompletionPort, &dwNumRead, (DWORD*)&pCntx, &lpOverlapped, INFINITE);
if (bResult == FALSE && lpOverlapped == NULL)
{
FatalError("WorkerThread - GetQueuedCompletionStatus()错误.\n");
}
else if (bResult == FALSE && lpOverlapped != NULL)
{
fprintf(stderr,"用户非正帔R?\n");
}
else if (dwNumRead == 0)
{
fprintf(stderr, "用户已经退?\n");
fprintf(stderr, "------------------.\n");
}
else
{
printf("recv data from client: %s\n", pCntx->InBuffer);
}
}
}