妖尾之冰系神话:socket 编程:如何判断客户端中断

来源:百度文库 编辑:高校问答 时间:2024/04/27 18:26:46
下面是源程序的一部分:

main()
{
int sockfd,client_fd,sin_size,len,n;
char buf[MAXDATASIZE];
char cmd[1024];
char c;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
FILE *f,*logf;
if ( (logf=fopen("tcp_cmdsrv.log","a+"))==NULL ) {printf("write file tcp_cmdsrv.log err!\n");return;}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket err!"); exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind出错!");
exit(1);
}
printf("Bind in %s\n",inet_ntoa(my_addr.sin_addr));
if (listen(sockfd, BACKLOG) == -1) {
perror("listen出错!");
exit(1);
}
while(1) {
client_fd=0;
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,&sin_size)) == -1) {
perror("accept出错");
}
fprintf(logf,"%s ",GetNowDateTime());
fprintf(logf,"%s ",inet_ntoa(remote_addr.sin_addr));
strcpy(cmd,"");
for(;;)
{
if(client_fd<0) {close(client_fd);break;}
if ( (read(client_fd,buf,1)) < 0 ) { perror("read出错!");break;}
else {
sprintf(cmd,"%s%c",cmd,buf[0]);
if (buf[0]=='\n')
{
len=strlen(cmd);
if(len>0)
{
fprintf(logf,"%s\n",cmd);
cmd[len-2]=0;
if (!(f=popen(cmd,"r") )) {printf("popen()!\n");fclose(logf);close(f);close(client_fd);break;} /*popen :调用执行UNIX Shell */
while (fgets(buf,3,f) != NULL) write(client_fd,buf,strlen(buf));
}
fclose(logf);
close(client_fd);
break;
}
}
}
}
}
当客户端在执行程序的过程中,服务器还没有返回结果时,客户端就中断了连接,服务器程序退出;我不想让服务器在此时退出,应如何处理???

if(client_fd<0) {close(client_fd);break;}
if ( (read(client_fd,buf,1)) < 0 ) { perror("read出错!");break;}
上两句中的break;删除,则不会退出。
在想要退出的地方用exit(0);