我写了一个多线程的网络处理程序,当一个客户端连接上本服务程序以后,服务器就为这个客户端开一个线程处理该客户机的请求,但是实际运行时,当客户机第一次连接上以后可以执行线程的处理函数,以后客户机再连接时服务程序都没有反应,怎么回事啊?//---------------------------------------------------------------------
// 主服务函数:
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然后服务程序对任何客户机的请求都不响应了,怎么回事?
// 主服务函数:
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然后服务程序对任何客户机的请求都不响应了,怎么回事?
这里一定返回吗?
还是掉住了?
问题出在我的线程处理函数:
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号就可以了
这条语句打印却总是滞后才打印出来,有时必须在控制台按一下空格键才显示出来。