+ -
当前位置:首页 → 问答吧 → 求助,关于服务器程序里的printf

求助,关于服务器程序里的printf

时间:2010-08-21

来源:互联网

本帖最后由 stone421 于 2010-08-21 22:12 编辑

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

#define MAXLINE 1024
#define BACKLOG 5
#define err_quit(str) printf(str),\
              exit(0)

void str_echo(int sockfd)
{
        ssize_t n;
        char line[MAXLINE];
        while(1)
        {               
                if((n=Readline(sockfd,line,MAXLINE))==0) //读一行
                return ;
                                printf("hello\n");  
                Writen(sockfd,line,n);//写n字节
        }
}

int main()
{
        void str_echo(int);
        int listenfd,connfd;
        pid_t childpid;
        socklen_t chilen;
        struct sockaddr_in cliaddr,seraddr;

        if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
        {
                err_quit("socket err\n");
        }
       
        bzero(&seraddr,sizeof(seraddr));
        seraddr.sin_family=AF_INET;
        seraddr.sin_port=htons(8003);
        seraddr.sin_addr.s_addr=htonl(INADDR_ANY);

        if (bind(listenfd,(struct sockaddr *)&seraddr,sizeof(seraddr))<0)
        {
                err_quit("bind err\n");
        }
       
        if (listen(listenfd,BACKLOG)<0)
        {
                err_quit("listen err\n");
        }

        while (1)
        {
                chilen=sizeof(cliaddr);
                if ((connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&chilen))<0)
                {
                        if(errno==EINTR||errno==ECONNABORTED)
                        {
                                continue;
                        }
               
                        err_quit("accept err\n");
       
                }
               
                if (0==(childpid=fork()))
                {
                        if(-1==close(listenfd))
                        {
                                err_quit("close child listenfd err\n");
                        }

                        str_echo(connfd);
                        if(-1==close(connfd))
                        {
                                err_quit("close child connfd err\n");
                        }
                        exit(0);
                }
                else if(-1==childpid)
                {
                        err_quit("fork err\n");
                }

                if(-1==close(connfd))
                {
                        err_quit("close parent connfd err\n");
                }

        }

        return 0;
}


这是我照着unix网络编程里的回射程序写的,为什么str_echo函数里的printf("hello\n");只有在连接断开时才打印出来呢,不是读了一行客户发过来的数据之后就打印吗?谁能帮我讲讲这里面的道理吗?谢谢!

作者: stone421   发布时间: 2010-08-21

buffer ???

作者: churchmice   发布时间: 2010-08-21