关于标准输出流的问题
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- #define PORT 51000
- #define MAXSIZE 512
- int main(){
- struct sockaddr_in server;
- struct sockaddr_in client;
- int listenfd,connectfd;
- char buf[MAXSIZE];
- if(-1==(listenfd=socket(AF_INET,SOCK_STREAM,0))){
- perror("socket error\n");
- exit(1);
- }
- int opt=SO_REUSEADDR;
- setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
- bzero(&server,sizeof(server));
- server.sin_family=AF_INET;
- server.sin_port=htons(PORT);
- server.sin_addr.s_addr=htonl(INADDR_ANY);
- if(-1 == bind(listenfd,(struct sockaddr*)&server,sizeof(server))){
- perror("bind error\n");
- exit(1);
- }
- if(-1 == listen(listenfd,5)){
- perror("listen error\n");
- exit(1);
- }
- socklen_t len=sizeof(client);
- pid_t pid;
- while(1){
- if(-1==(connectfd=accept(listenfd,(struct sockaddr *)&client,&len))){
- perror("accept error\n");
- exit(1);
- }
- if(-1==(pid=fork())){
- perror("fork error\n");
- exit(1);
- }
- else if (pid == 0){
- close(listenfd);
- memset(buf,0,sizeof(buf));
- int slen=0;
- while(1){
- memset(buf,0,sizeof(buf));
- slen=recv(connectfd,buf,sizeof(buf),0);
- if(0>slen){
- perror("recv error\n");
- exit(1);
- }
- buf[slen]='\0';
- printf("%s\n",buf);
- //printf("%s",buf); //不能接收到马上输出
- if(0==strcmp(buf,"bye"))
- break;
- }
- close(connectfd);
- exit(0);
- }
- else
- close(connectfd);
- }
- close(listenfd);
- return 0;
- }
复制代码这个程序是个TCP服务端程序,功能是接收客户端发送的字符串,并马上输出。
问题在于第69行如果换成70行的话,要断开连接后,服务端才会将客户端发送过来的所有字符串打印到屏幕上
造成这样的原因是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
同学写的程序,没有注释,加一份有简单注释的
复制代码
标准输出默认是行缓冲的。
谢谢