控制台程序, 忽然停止执行, 点一下,窗口, 敲回车又继续了. 请问如何 避免.
VC6 sp6 控制台,项目。
Win2000 sp4
程序是 c/s 结构中的 server 。
采用的 select 模型。
问题:程序偶尔会停止 执行,点一下,窗口, 敲回车又继续了.
不知道如何避免, 请帮忙看看, 非常感谢!
主循环代码。
while(1)
{
read_fds = master; // copy it
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1)
{
perror("select");
exit(1);
}
if (FD_ISSET (listener, &read_fds))
{
addrlen = sizeof(remoteaddr);
if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr,
&addrlen)) == -1)
{
perror("accept");
}
else
{
FD_SET(newfd, &master); // add to master set
if ((int)newfd > fdmax)
fdmax = newfd ; // keep track of the maximum
CreateClientEvnElement (newfd, remoteaddr.sin_addr.s_addr) ;
}
}
pClient = GetClientEvnList () ;
while (pClient)
{
if (FD_ISSET (pClient->sock, &read_fds))
{
recvClientDataRtn = RevcClientData (pClient) ;
//
if (recvClientDataRtn > 0)
{
printf ("recv data len : %d\n", recvClientDataRtn) ;
}
else if (recvClientDataRtn == CLIENTEVN_RECVDATA_UNFINISHED)
{
// do nothing .
printf ("CLIENTEVN_RECVDATA_UNFINISHED !\n") ;
}
else
{
switch (recvClientDataRtn)
{
case CLIENTEVN_CONNECT_CLOSE:
case CLIENTEVN_RECVDATA_SOCKERROR :
// delete client
closesocket (pClient->sock);
FD_CLR(pClient->sock, &master);
pClientForDel = pClient->next ;
DeleteClientEvnElement (pClient) ;
pClient = pClientForDel ;
continue ;
break;
case CLIENTEVN_RECVDATA_BUFOVER :
printf ("CLIENTEVN_RECVDATA_BUFOVER !\n") ;
break ;
case CLIENTEVN_RECVDATA_TPKTERROR :
printf ("CLIENTEVN_RECVDATA_TPKTERROR !\n") ;
break ;
default:
printf ("UNKNOW error ! : %d\n", recvClientDataRtn) ;
}
}
}
pClient = pClient->next ;
}
ReleaseClientEvnList () ;
}