很奇怪的问题,晕了!
精锐掷矛手 2010-01-13 10:43:32 DWORD WINAPI IOCP::AcceptThread( void *pParam )
{
IOCP * m_piocp=reinterpret_cast<IOCP*>(pParam);
if(!m_piocp)
return -1;
SOCKET sListen = m_piocp->m_listen; //监听套接字
SOCKET sAccept = INVALID_SOCKET;
HANDLE hComPort = m_piocp->m_IOHandle; //完成端口
while (m_piocp->m_Run)
{
DWORD dwRet;
dwRet = WSAWaitForMultipleEvents(1,&m_piocp->m_Accept,FALSE,100,FALSE);
if(!m_piocp->m_Run) //服务器停止服务
break;
if (dwRet == WSA_WAIT_TIMEOUT) //函数调用超时
continue;
WSANETWORKEVENTS events; //查看发生的网络事件
int nRet = WSAEnumNetworkEvents(sListen,m_piocp->m_Accept,&events);
if (nRet == SOCKET_ERROR)
{
m_piocp->AppendLog("WSAEnumNetworkEvents函数错误");
break;
}
if ( events.lNetworkEvents & FD_ACCEPT) //发生FD_ACCEPT网络事件
{
if ( events.iErrorCode[FD_ACCEPT_BIT] == 0 && m_piocp->m_Run)
{
SOCKADDR_IN ClientAddr;
int serAddrLen = sizeof(ClientAddr);
sAccept=WSAAccept(sListen,(SOCKADDR*)&ClientAddr,&serAddrLen,ConnectAcceptCondition,0);
if (INVALID_SOCKET==sAccept)
return -1;
if (!m_piocp->m_Run)
{
closesocket(sAccept);
return -1;
}
//创建客户端对象
ClientContext * Client= new ClientContext(ClientAddr,sAccept);
if (CreateIoCompletionPort((HANDLE)sAccept, hComPort,(DWORD)Client,0) == NULL)
return -1;
m_piocp->AddToClientList(Client);
if(!Client->Recv())
m_piocp->RemoveClient(Client);
}
}
}
return 0;
}
每执行到红色代码时,boundsChecker提示Questionable use of thread.Thread created using CreateThread rather than _beginthread
vc输出irst-chance exception in IOCPServer.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
程序运行一段时间后报错,Client的数据被篡改了,应该是内存越界。内存越界跟这个现象有关系吗?
很迷惑,望高手指教?