免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2092 | 回复: 3

关于标准输出流的问题 [复制链接]

论坛徽章:
0
发表于 2011-04-27 17:55 |显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <sys/socket.h>

  9. #define PORT 51000
  10. #define MAXSIZE 512

  11. int main(){
  12.         struct sockaddr_in server;
  13.         struct sockaddr_in client;

  14.         int listenfd,connectfd;
  15.         char buf[MAXSIZE];

  16.         if(-1==(listenfd=socket(AF_INET,SOCK_STREAM,0))){
  17.                 perror("socket error\n");
  18.                 exit(1);
  19.         }

  20.         int opt=SO_REUSEADDR;
  21.         setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  22.         bzero(&server,sizeof(server));

  23.         server.sin_family=AF_INET;
  24.         server.sin_port=htons(PORT);
  25.         server.sin_addr.s_addr=htonl(INADDR_ANY);

  26.         if(-1 == bind(listenfd,(struct sockaddr*)&server,sizeof(server))){
  27.                 perror("bind error\n");
  28.                 exit(1);
  29.         }

  30.         if(-1 == listen(listenfd,5)){
  31.                 perror("listen error\n");
  32.                 exit(1);
  33.         }

  34.         socklen_t len=sizeof(client);
  35.         pid_t pid;
  36.         while(1){
  37.                 if(-1==(connectfd=accept(listenfd,(struct sockaddr *)&client,&len))){
  38.                         perror("accept error\n");
  39.                         exit(1);
  40.                 }

  41.                 if(-1==(pid=fork())){
  42.                         perror("fork error\n");
  43.                         exit(1);
  44.                 }
  45.                 else if (pid == 0){
  46.                         close(listenfd);
  47.                         memset(buf,0,sizeof(buf));

  48.                         int slen=0;
  49.                         while(1){
  50.                                 memset(buf,0,sizeof(buf));
  51.                                 slen=recv(connectfd,buf,sizeof(buf),0);
  52.                                 if(0>slen){
  53.                                         perror("recv error\n");
  54.                                         exit(1);
  55.                                 }
  56.                                 buf[slen]='\0';

  57.                                 printf("%s\n",buf);
  58.                                 //printf("%s",buf);  //不能接收到马上输出
  59.                                 if(0==strcmp(buf,"bye"))
  60.                                         break;
  61.                         }
  62.                         close(connectfd);
  63.                         exit(0);
  64.                 }
  65.                 else
  66.                         close(connectfd);
  67.         }
  68.         close(listenfd);
  69.         return 0;
  70. }
复制代码
这个程序是个TCP服务端程序,功能是接收客户端发送的字符串,并马上输出。
问题在于第69行如果换成70行的话,要断开连接后,服务端才会将客户端发送过来的所有字符串打印到屏幕上
造成这样的原因是什么?

论坛徽章:
0
发表于 2011-04-27 17:58 |显示全部楼层
同学写的程序,没有注释,加一份有简单注释的
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <sys/socket.h>

  9. #define PORT 51000
  10. #define MAXSIZE 512

  11. int main(){
  12.         struct sockaddr_in server;
  13.         struct sockaddr_in client;

  14.         int listenfd,connectfd;
  15.         char buf[MAXSIZE];

  16.         //设置套接字
  17.         if(-1==(listenfd=socket(AF_INET,SOCK_STREAM,0))){
  18.                 perror("socket error\n");
  19.                 exit(1);
  20.         }

  21.         int opt=SO_REUSEADDR;
  22.         setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  23.         bzero(&server,sizeof(server));

  24.         server.sin_family=AF_INET;
  25.         server.sin_port=htons(PORT);
  26.         server.sin_addr.s_addr=htonl(INADDR_ANY);

  27.         //绑定端口
  28.         if(-1 == bind(listenfd,(struct sockaddr*)&server,sizeof(server))){
  29.                 perror("bind error\n");
  30.                 exit(1);
  31.         }


  32.         //监听端口
  33.         if(-1 == listen(listenfd,5)){
  34.                 perror("listen error\n");
  35.                 exit(1);
  36.         }

  37.         socklen_t len=sizeof(client);
  38.         pid_t pid;
  39.         while(1){
  40.                 //处理客户端请求
  41.                 if(-1==(connectfd=accept(listenfd,(struct sockaddr *)&client,&len))){
  42.                         perror("accept error\n");
  43.                         exit(1);
  44.                 }

  45.                 if(-1==(pid=fork())){
  46.                         perror("fork error\n");
  47.                         exit(1);
  48.                 }
  49.                 else if (pid == 0){
  50.                         close(listenfd);
  51.                         memset(buf,0,sizeof(buf));

  52.                         int slen=0;
  53.                         while(1){
  54.                                 memset(buf,0,sizeof(buf));
  55.                                 //接收客户端发送过来的字符串并显示出来
  56.                                 slen=recv(connectfd,buf,sizeof(buf),0);
  57.                                 if(0>slen){
  58.                                         perror("recv error\n");
  59.                                         exit(1);
  60.                                 }
  61.                                 buf[slen]='\0';

  62.                                 printf("%s\n",buf);
  63.                                 //printf("%s",buf);  //不能接收到马上输出
  64.                                 if(0==strcmp(buf,"bye"))
  65.                                         break;
  66.                         }
  67.                         close(connectfd);
  68.                         exit(0);
  69.                 }
  70.                 else
  71.                         close(connectfd);
  72.         }
  73.         close(listenfd);
  74.         return 0;
  75. }
复制代码

论坛徽章:
0
发表于 2011-04-27 18:02 |显示全部楼层
标准输出默认是行缓冲的。

论坛徽章:
0
发表于 2011-04-27 18:18 |显示全部楼层
标准输出默认是行缓冲的。
whaaat 发表于 2011-04-27 18:02



谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP