Problem in multithreaded chat server.
Hi,
I have created a multithreaded chat server and it works without any
problem in debug mode but causes a access violation in a release mode built
in
sockcore.cpp in line 468 (CAsyncSocket::AttachHandle)
Here is a description of the classes and functioning of my server:
1) class CServerThread : public CWinThread
2) class CListenSocket : public CAsyncSocket
3) class CServerSocket : public CAsyncSocket
4) CListenSocket's object is used to listen on a port.
5) In the OnAccept handler, AfxBeginThread() starts the thread.
6) The problem starts in the InitInstance() where the CAsyncSocket::Attach()
is called to attach the
socket handle to the CAsyncSocket() object which (handle) was set in
thread class in the OnAccept()
handler.
Here is the code :
void CListenSocket::OnAccept(int nErrorCode)
{
CAsyncSocket soc;
Accept(soc);
CServerThread* pThread =
(CServerThread*)AfxBeginThread(RUNTIME_CLASS(CServerThread),
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThread->SetSocket(soc.Detach());
pThread->SetTarget(target);
pThread->ResumeThread();
CAsyncSocket::OnAccept(nErrorCode);
}
BOOL CServerThread::InitInstance()
{
target->PostMessage(UWM_THREADSTART, 0, (LPARAM)m_nThreadID);
sock.SetTarget(target);
sock.threadID = m_nThreadID;
if(socket != NULL)
{
sock.Attach(socket); //PROBLEM is here
}
return TRUE; //But the debugger points here (in release mode ,no problem
shown in debug mode)
}
Where sock is a object of CServerSocket and SOCKET socket;
Call stack is:
Chat Server.exe!CAsyncSocket::AttachHandle(unsigned int hSocket=3844, CAsyncSocket* pSocket=0x003e620c, int bDead=0) Line 468 + 0x3 bytes C++
Chat Server.exe!CAsyncSocket::Attach(unsigned int hSocket=3844, long
lEvent=63) Line 132 C++
Chat Server.exe!CServerThread::InitInstance() Line 36 C++
Chat Server.exe!_AfxThreadEntry(void * pParam=0x0013faec) Line 113 + 0x7
bytes C++
Chat Server.exe!_callthreadstartex() Line 348 + 0x6 bytes C
Chat Server.exe!_threadstartex(void * ptd=0x003e7b60) Line 326 + 0x5
bytes C
kernel32.dll!7c80b50b()
[Frames below may be incorrect and/or missing, no symbols loaded for
kernel32.dll]
kernel32.dll!7c8399f3()
And the exception occurs at this point in sockcore.cpp
void PASCAL CAsyncSocket::AttachHandle(
SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead)
{
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
BOOL bEnable = AfxEnableMemoryTracking(FALSE);
TRY
{
if (!bDead)
{
ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);
if (pState->m_pmapSocketHandle->IsEmpty()) //ACCESS VIOLATION OCCURS HERE
{ ...
Please help me,
Thank you.