做一个局域网聊天软件时,当客户端给服务器发送信息时,出现不合适的参数对话框,跳过,然后弹出对话框,服务器崩溃,但我的信息确实是发送到另一客户端了。我用断点测试了一下,发现问题出在一个意想不到的地方,以前没出过问题,就是在我增加了一些新功能后才出现的。就是服务器主线程中用select模型判断是否有客户端的连接请求,我想不通问题怎么会出在这,一下是部分代码:
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
CQQSrvDlg *pMainDlg=(CQQSrvDlg*)lpParameter;
 
  SOCKADDR_IN addrClient;
   int len=sizeof(SOCKADDR);
   
  while(1)
{
if(pMainDlg->m_sign==false)
{
  if(pMainDlg->SOCKET_Select(pMainDlg->m_listensocket ,100,true))
{
   SOCKET sockConn=accept(pMainDlg->m_listensocket,(SOCKADDR*)&addrClient,&len);
  
   //得到客户端的IP地址
CString str;
str.Format (_T("%s"),(char*)inet_ntoa(addrClient.sin_addr ));

   CClientItem tItem;
   tItem.m_aceSock=sockConn;
   tItem.m_strIp=str;
tItem.m_pMainWnd =pMainDlg;
tItem.m_QQnum=_T("");
   int idx=pMainDlg->m_array.Add(tItem);
//创建一个与客户端交互的线程,初始状态是让线程挂起,不执行,目的是为了得到句柄,每次有新的
//客户端发送连接请求后,都会创建一个新的线程,用来与服务器交互,每个客户端独立于一个线程,
//若客户端离开,则该线程会成功返回,连接断开
HANDLE hThread = CreateThread(NULL,0,ClientThreadProc,&(pMainDlg->m_array.GetAt (idx)),CREATE_SUSPENDED,NULL);
//在该环境下,用ElementAt,返回一个类型变量引用,此处不能用GetAT
pMainDlg->m_array.ElementAt(idx).hThread =hThread;
//激活线程,让线程重新运行
ResumeThread(hThread);
}
Sleep(100);
}
else
break;
}
 
return 0;
}