关于标准输出流的问题

发布于 2022-10-15 08:23:56 字数 6153 浏览 23 评论 0

  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行的话,要断开连接后,服务端才会将客户端发送过来的所有字符串打印到屏幕上
造成这样的原因是什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

゛时过境迁 2022-10-22 08:23:56

同学写的程序,没有注释,加一份有简单注释的

  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. }

复制代码

我做我的改变 2022-10-22 08:23:56

标准输出默认是行缓冲的。

笔落惊风雨 2022-10-22 08:23:56

标准输出默认是行缓冲的。
whaaat 发表于 2011-04-27 18:02

谢谢

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文