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