当前位置: 技术问答>linux和unix
再问网络编程里的些些问题,有关while的
来源: 互联网 发布时间:2016-09-27
本文导语: 直接上代码: /服务端部分: while(1){ sizecli = sizeof(cliaddr); acceptfd = accept(socketfd,(struct sockaddr*)&cliaddr,&sizecli); if(acceptfd == -1){ perror("accpet"); exit(0); } printf("acceptfd OKn"); while((recthing = read(acceptfd,buf,size...
直接上代码:
/服务端部分:
while(1){
sizecli = sizeof(cliaddr);
acceptfd = accept(socketfd,(struct sockaddr*)&cliaddr,&sizecli);
if(acceptfd == -1){
perror("accpet");
exit(0);
}
printf("acceptfd OKn");
while((recthing = read(acceptfd,buf,sizeof(buf))) > 0){
printf("%dn",recthing);
buf[recthing] = 0;
printf("receive message:%sn",buf);
// fputs(buf,stdout);
// fflush(stdout);
}
printf("start...n");
memset(buf,0,sizeof(buf));
sprintf(buf,"%s","ser get it");
if(send(acceptfd,buf,strlen(buf),0) == -1){
perror("send");
exit(0);
}
close(acceptfd);
}
/客户端部分:
if((inet_pton(AF_INET,argv[1],&servaddr.sin_addr)) ==-1){
perror("inet_pton");
exit(0);
}
if(connect(socketfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1){
perror("connect");
exit(0);
}
memset(buf,0,sizeof(buf));
sprintf(buf,"%s",argv[2]);
write(socketfd,buf,strlen(buf));
printf("cli to ser OKn");
// memset(buf,0,sizeof(buf));
if((n = recv(socketfd,buf,sizeof(buf),0)) == -1){
perror("recv");
exit(0);
}
else{
buf[n] = 0;
printf("%sn",buf);
}
close(socketfd);
exit(0);
}
本人稍微改了下程序想实现客户端先传数据个服务端,然后服务端传给确定给客户端,但运行的时候服务端就停留在while((recthing = read(acceptfd,buf,sizeof(buf))) > 0)这边,直到客户端结束服务端才正常执行之后的代码,这是为何呢?望大哥大姐们帮帮忙的啊.....
/服务端部分:
while(1){
sizecli = sizeof(cliaddr);
acceptfd = accept(socketfd,(struct sockaddr*)&cliaddr,&sizecli);
if(acceptfd == -1){
perror("accpet");
exit(0);
}
printf("acceptfd OKn");
while((recthing = read(acceptfd,buf,sizeof(buf))) > 0){
printf("%dn",recthing);
buf[recthing] = 0;
printf("receive message:%sn",buf);
// fputs(buf,stdout);
// fflush(stdout);
}
printf("start...n");
memset(buf,0,sizeof(buf));
sprintf(buf,"%s","ser get it");
if(send(acceptfd,buf,strlen(buf),0) == -1){
perror("send");
exit(0);
}
close(acceptfd);
}
/客户端部分:
if((inet_pton(AF_INET,argv[1],&servaddr.sin_addr)) ==-1){
perror("inet_pton");
exit(0);
}
if(connect(socketfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1){
perror("connect");
exit(0);
}
memset(buf,0,sizeof(buf));
sprintf(buf,"%s",argv[2]);
write(socketfd,buf,strlen(buf));
printf("cli to ser OKn");
// memset(buf,0,sizeof(buf));
if((n = recv(socketfd,buf,sizeof(buf),0)) == -1){
perror("recv");
exit(0);
}
else{
buf[n] = 0;
printf("%sn",buf);
}
close(socketfd);
exit(0);
}
本人稍微改了下程序想实现客户端先传数据个服务端,然后服务端传给确定给客户端,但运行的时候服务端就停留在while((recthing = read(acceptfd,buf,sizeof(buf))) > 0)这边,直到客户端结束服务端才正常执行之后的代码,这是为何呢?望大哥大姐们帮帮忙的啊.....
|
你的服务端没有检查读到的数据长度,没完没了的读,把客户端的数据读完了,服务端自己就阻塞在read上了
|
1.没有必要一直用while()让他一直读取数据。
2.socket里面,read默认是阻塞的,也就是说,你一直while的话,就算没有了数据,read就会阻塞,直到有数据来。
你可以这样,read之后先把这次数据处理了,改发送的发送,处理完毕之后然后返回再去试着read。
2.socket里面,read默认是阻塞的,也就是说,你一直while的话,就算没有了数据,read就会阻塞,直到有数据来。
你可以这样,read之后先把这次数据处理了,改发送的发送,处理完毕之后然后返回再去试着read。