SOCKET s = socket(...);
bind(s, ...);
listen(s, ...);
AfxBeginThread(threadproc, (LPVOID)s);
...
if(g_bTerminate)  //User wants to terminate current process
{
  closesocket(s); //causes the listening thread which invokes accept to quit
  WaitForMultiObjects(...)  //Waits for all threads to terminate
  CloseHandle(...)          //Closes all opening thread handles
}
UINT threadproc(LPVOID pParam)
{
   SOCKET s = (SCOKET)pParam;
   SOCKET sl;
   sl = accept(s);
   if(sl == INVALID_SOCKET)
      return -1;   AfxBeginThread(threadproc, (LPVOID)s);   if(g_bTerminate) //Always don't forget to check termination flag
   {
      ...//do some cleanup
      return -1;
   }
   ... //communicate with client via socket sl, conversation step 1   if(g_bTerminate) //Always don't forget to check termination flag
   {
      ...//do some cleanup
      return -1;
   }
   ... //conversation step 2   if(g_bTerminate) {...}
   ... //conversation step 3   ...
 
   return 0
}

解决方案 »

  1.   

    如果不用WinsockAPI用CSocket如何实现呢?
      

  2.   

    用Attach和Detach传递SOCKET句柄能否让线程使用线程外建立的CSocket?
      

  3.   

    To azuo_lee
    在Thread里面继续开Thread?
    为什么要把AfxBeginThread(threadproc, (LPVOID)s)放在threadproc里?
      

  4.   

    Attach、Detach当然可以用来在线程间传递CSocket的句柄。
    但CSocket是在是个不伦不类的东西,我不知道你看中了它的哪一点。说它是阻塞的吧,它其实根本不是,它是从CAsycSocket继承而来,会生成一个hwndSocket,并全是调用Async版的socket函数;说它是不阻塞的吧,它在解析地址时会调用block版的函数gethostbyname,因此在你第一次解析域名时它会阻塞住(CAsyncSocket也是这副德行)。说实话,我对MFC中有这样的东西实在感到遗憾。把BeginThread放到thread里面是为了避免将accept放在主线程中,这样主线程随时可以通过简单的closesocket调用结束正在等待连接的线程。否则如果主线程阻塞在accept调用时,想结束进程还是个很头疼的问题。
      

  5.   

    CSocket、CAsycSocket是垃圾,我写多线程SOCKET程序从不用它们。