紧急求助 accept 崩溃
自己做了个服务器,平均在线也就500人,莫名其妙的会在Socket accept函数处崩溃,有时候一两个昨期才崩溃,有时候一天就崩溃好几次,自己做压力测试时又不会崩溃。accept崩溃让我非常无法理解,始终没有找到原因,希望大家能帮忙,必有重谢!!
一、崩溃时的堆栈信息
Unhandled exception: 09/18/2008 17:41:43
Exception code: C0000005 ACCESS_VIOLATION
Fault address: 7C95A6CE 01:000296CE C:\WINDOWS\system32\ntdll.dll
Registers:
EAX:00000000
EBX:0000008A
ECX:05570000
EDX:05570000
ESI:00000000
EDI:05572BB0
CS:EIP:001B:7C95A6CE
SS:ESP:0023:056AF890 EBP:056AFAAC
DS:0023 ES:0023 FS:003B GS:0000
Flags:00010287
Call stack:
Address Frame
7C95A6CE 056AFAACwcslen + 150
0001:000296CE C:\WINDOWS\system32\ntdll.dll
71A84740 056AFBBC0001:00003740 C:\WINDOWS\system32\mswsock.dll
71A9AD20 056AFDFCStopWsdpService + 4F92
0001:00019D20 C:\WINDOWS\system32\mswsock.dll
71B71024 056AFE30WSAAccept + 85
0001:00010024 C:\WINDOWS\system32\WS2_32.dll
71B712C2 056AFE4Caccept + 17
0001:000102C2 C:\WINDOWS\system32\WS2_32.dll
00398397 056AFFB8CGCSIoCP::AcceptThread + 77
0002:0000E397 D:\server\allserver\GCSRTNet.dll
e:\99develope\program\net\gcsrtnet\gcsiocp.cpp line 216
e:\99develope\program\net\gcsrtnet\gcsiocp.cpp line 216
7C824829 056AFFECGetModuleHandleA + DF
0001:00023829 C:\WINDOWS\system32\kernel32.dll
mswsock.dll, file version: 5.2.3790.3959 (srv03_sp2_rtm.070216-1710); product version: 5.2.3790.3959
module name: mswsock.dll, base adress:71A80000
32 percent of memory is in use.
There are 2097151 total Kbytes of physical memory.
There are 2097151 free Kbytes of physical memory.
There are 4194303 total Kbytes of paging file.
There are 4194303 free Kbytes of paging file.
There are 1fff80 total Kbytes of virtual memory.
There are 1e34e0 free Kbytes of virtual memory.
二、代码摘要
//接受连接的SOCKET创建过程
BOOL CGCSIoCP::InitNet(WORD wPort)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
if(WSAStartup( wVersionRequested, &wsaData ) !=0 )
{
return FALSE;
}
//监听端口
m_sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(m_sListen == INVALID_SOCKET)
{
return FALSE;
}
SOCKADDR_IN addr;
ZeroMemory(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(wPort);
if(bind(m_sListen, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
closesocket(m_sListen);
return FALSE;
}
if(listen(m_sListen, 100) == SOCKET_ERROR)
{
closesocket(m_sListen);
return FALSE;
}
return TRUE;
}
//接收链接的线程
DWORD WINAPI CGCSIoCP::AcceptThread(void* pVoid)
{
SOCKADDR_IN addrAccept;
int addrlen = sizeof(SOCKADDR_IN);
ZeroMemory(&addrAccept, addrlen);
SOCKET sockAccept= INVALID_SOCKET;
while(TRUE)
{
//这个地方会崩溃,,有时候一两个昨期才崩溃,有时候一天就崩溃好几次,自己做压力测试时没有问题
//addrlen的值我检查了,始终是16
if((sockAccept=accept(m_sListen, (SOCKADDR*)&addrAccept, &addrlen))==INVALID_SOCKET)
{
continue;
}
...
}
return 0;
}