我写了一个多线程的网络处理程序,当一个客户端连接上本服务程序以后,服务器就为这个客户端开一个线程处理该客户机的请求,但是实际运行时,当客户机第一次连接上以后可以执行线程的处理函数,以后客户机再连接时服务程序都没有反应,怎么回事啊?//---------------------------------------------------------------------
//  主服务函数:
void process
{
  listen(sock, 5);//监听
  do {     
     msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);
     if (msgsock == -1)
       printf("\nOne client connection has been refused");
     else 
      {//开线程处理客户机的请求数据信息   
       fdSock=(int *) malloc(sizeof(int));
       *fdSock = msgsock;    
       pThread=AfxBeginThread(ClientProcess,fdSock);
       ASSERT(pThread);
       pThread->m_bAutoDelete=false;
       pThread->ResumeThread();
       WaitForSingleObject(pThread->m_hThread,INFINITE);
      }
  while(1);
}//-----------------------------------------------
// 线程处理函数
UINT ClientProcess(LPVOID pParam)
{
     UINT result=0;
     int msgsock, * fdSock ;
     fdSock = (int * )pParam;
     msgsock = *fdSock;
     free(fdSock);
     printf("\n msgsock=%d",msgsock);//仅仅打印一个连接的socket号就可以了
     return result;
}运行结果:
msgsock=980然后服务程序对任何客户机的请求都不响应了,怎么回事?

解决方案 »

  1.   

    Pipi0714(皮皮0714) :那你们是怎么处理这类问题的?
      

  2.   

    WaitForSingleObject(pThread->m_hThread,INFINITE);
    这里一定返回吗?
    还是掉住了?
      

  3.   

    问题终于找到了!
    问题出在我的线程处理函数:
    UINT ClientProcess(LPVOID pParam)
    {
         UINT result=0;
         int msgsock, * fdSock ;
         fdSock = (int * )pParam;
         msgsock = *fdSock;
         free(fdSock);
         printf("\n msgsock=%d",msgsock);//仅仅打印一个连接的socket号就可以了
         return result;
    }因为线程处理函数返回时,msgsock没有关闭,因此下一个连接到达的时候只有排队等待,导致阻塞。只需在该线程处理函数的return result 前加上: closesocket(msgsock);
    这样就可以正确接收新的连接了。但是还有一个问题,就是虽然可以执行,但是
      printf("\n msgsock=%d",msgsock);//仅仅打印一个连接的socket号就可以了
    这条语句打印却总是滞后才打印出来,有时必须在控制台按一下空格键才显示出来。