DWORD WINAPI CIOCPServer::_ListenThread(LPVOID lpParam)
{ CIOCPServer* pServer=(CIOCPServer*)lpParam;

DWORD nThreadID=0;
for(int i=0;i<MAX_WORK_THREAD;i++)
{
DWORD nID=0;
::CreateThread(NULL,0,_WorkThread,lpParam,0,&nID);
} ::listen(pServer->m_sockListen,10);

while(1)
{
int len=sizeof(sockaddr);
sockaddr_in addr;
SOCKET sockClient=::accept(pServer->m_sockListen,(sockaddr*)&addr,&len);
PER_HANDLE_DATA* pHandle=pServer->AllocatePerHanle(sockClient,&addr);
bool bRet=pServer->AddAConnection(pHandle);
if(bRet==0)
{
printf("连接数已满\n");
pServer->ReleaseAPerHandle(pHandle);
}
else
{
::CreateIoCompletionPort((HANDLE)sockClient,pServer->m_hComplete,(DWORD)pHandle,0);
}

pServer->PostRecv(sockClient);
}
return 0;
}
这是监听线程,初始运行时到accept()是阻塞,此时启动客户端,accept返回,
继续运行,再次运行到accept是报错,但三个参数的地址都不为NULL,pServer也不为NULL,
为什么会这样,奇怪啊.?请求高手解决

解决方案 »

  1.   

    WSAGetLastError()的返回值是多少?
      

  2.   

    SOCKET sockClient=::accept(pServer->m_sockListen,(sockaddr*)&addr,&len);
    到这行时,程序直接终止,该在什么地方调用WSAGetLastError()呢?
      

  3.   

    调试状态点报错的确定按钮,会跳转到如下汇编代码
    7C80A76D   mov         dword ptr [eax],ecx
      

  4.   

    做数据断点跟踪检查下pServer是不是被修改了
      

  5.   

    pServer是否有效,光看是否为NULL是没用的