我在多线程DLL中用CSocket通信,当有客户发送数据或连接到来时,不定期的或出现0xC000005的异常,跟踪发现问题在基类CAsynSocket::OnReceive中调用Receive时,nSocketError==10038,nLen为一个很大数。
   我的程序会不定期的检测已经建立的客户Socekt,如果发现该哦Scoekt很长时间没有数据收发则会关闭他,客户也会不停的连接、发送数据(间隔大约15秒一次)
   请问这是什么原因,如何解决?出错时的CallStack
CAsyncSocket::DoCallBack(unsigned int 1076, long 1) line 527 + 12 bytes
CSocket::ProcessAuxQueue() line 822
CSocketWnd::OnSocketNotify(unsigned int 1076, long 1) line 1126
CWnd::OnWndMsg(unsigned int 883, unsigned int 1076, long 1, long * 0x0012fa48) line 1815 + 17 bytes
CWnd::WindowProc(unsigned int 883, unsigned int 1076, long 1) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00442630 {CSocketWnd hWnd=0x000308b2}, HWND__ * 0x000308b2, unsigned int 883, unsigned int 1076, long 1) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x000308b2, unsigned int 883, unsigned int 1076, long 1) line 368
AfxWndProcBase(HWND__ * 0x000308b2, unsigned int 883, unsigned int 1076, long 1) line 220 + 21 bytes
USER32! 77df2a70()
USER32! 77df3015()
USER32! 77df4915()
CWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes
CDialog::DoModal() line 536 + 12 bytes
CSMSApp::InitInstance() line 103 + 11 bytes
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00132d31, int 1) line 39 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00132d31, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 77e67903()错误代码:
void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0 && lParam == 0)
return; // Has the socket be closed?
CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE); // If yes ignore message
if (pSocket != NULL)
return; pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, FALSE);
if (pSocket == NULL)
{
// Must be in the middle of an Accept call
pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);
ASSERT(pSocket != NULL);
pSocket->m_hSocket = (SOCKET)wParam;
CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FALSE);
} int nErrorCode = WSAGETSELECTERROR(lParam);
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
DWORD nBytes;
if (!pSocket->IOCtl(FIONREAD, &nBytes))
nErrorCode = WSAGetLastError();
//错误发生地,此时nErrorCode=10038
if (nBytes != 0 || nErrorCode != 0)
pSocket->OnReceive(nErrorCode); 
}
break;
case FD_WRITE:

解决方案 »

  1.   

    不要在多线程中使用CSocket这个类CSocket不支持多线程,使用CAsyncSocket
      

  2.   

    多线程中CAsyncSocket好像也不安全,我用过。
    最后自己封装了一个Socket类。关键是Socket榜定的窗口,要自己生成一个。
      

  3.   

    http://expert.csdn.net/Expert/topic/1567/1567896.xml?temp=.530987
      

  4.   

    直接用socket的函数好了,何必用什么CSocket