UINT StationListenThread(LPVOID  pParam)
{
CKGEDoc* pDoc;
CListenSocket* m_pListen;
CString strMsg;
BOOL bOk = FALSE;
UINT m_uPort;
pDoc = (CKGEDoc*)pParam;
m_uPort = pDoc->m_uPort;
m_pListen = new CListenSocket(pDoc);
if ( m_pListen )
{
pDoc->m_LogStr.Format("%u",pDoc->m_uPort);
if ( m_pListen->Create(168, SOCK_STREAM, FD_ACCEPT))   // 出错行
{
bOk = m_pListen->Listen();
}
if ( !bOk )
{
int nErr = m_pListen->GetLastError();
if ( nErr == WSAEADDRINUSE )
{
strMsg.Format(IDS_LISTEN_INUSE, pDoc->m_uPort);
}else
{
strMsg.Format(IDS_LISTEN_ERROR, pDoc->m_uPort);
}
AfxMessageBox( strMsg, MB_OK|MB_ICONSTOP );
m_pListen->Close();
delete m_pListen;
m_pListen = NULL;
}
while(true)
{
}
}else
{
AfxMessageBox( IDS_CANT_LISTEN, MB_OK|MB_ICONSTOP );
}
return 0;
}
提示错误所处的函数:void* CMapPtrToPtr::GetValueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
if (m_pHashTable == NULL)
return NULL; UINT nHash = HashKey(key) % m_nHashTableSize; // see if it exists
CAssoc* pAssoc;
for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
{
if (pAssoc->key == key)
return pAssoc->value;
}
return NULL;
}
麻烦大虾看看是怎么回事???

解决方案 »

  1.   

    CSocket 不能跨线程吧。
    用Socket API 还可以。
      

  2.   

    CSocket是基于窗口程序的,也就是必须和一个dialog主线程绑定。在辅助线程里是不能用的
      

  3.   

    原来如此,那怎么在一个子线程里创建监听?是不是一定要在主线程创建再detach进去子线程用?能说说用一个子线程作为监听服务线程的工作流程吗?是重载onaccept,还是用阻塞方式的accept()?
      

  4.   

    多线程还是不要用 MFC 封装的socket类了
    其实  socket 的 api 自己封装一下写成类一样很好用的
    就是没有  onaccept  onreceive等给你调用
      

  5.   

    CSocket 或者CAsyncSocket一定要在一个线程内运行,要不就手工夸线程传递消息。它们都是基于消息驱动的。。
      

  6.   

    封装一个SOCKET api类在实现上需要注意些什么细节?