UNIX網路程式設計學習(14)--使用select正確處理EOF的str_cli函式修訂版

pengfoo發表於2012-04-01
//select/strcliselect02.c
#include    "unp.h"

void
str_cli(FILE *fp,int sockfd)
{
    int     maxfdp1,stdineof;
    fd_set  rset;
//    char    sendline[MAXLINE],recvline[MAXLINE];
    char    buf[MAXLINE];
    int     n;

    stdineof = 0;
    FD_ZERO(&rset);
    for(; ;)
    {
        if(stdineof == 0)
            FD_SET(fileno(fp),&rset);
        FD_SET(sockfd,&rset);
        maxfdp1=max(fileno(fp),sockfd)+1;
        Select(maxfdp1,&rset,NULL,NULL,NULL);

        if(FD_ISSET(sockfd,&rset))
        {
            if((n=Read(sockfd,buf,MAXLINE)) == 0)//注意此行,(n=Read(sockfd,buf,MAXLINE))外面括號不能少!
            {
                if(stdineof == 1)
                    return;
                else
                    err_quit("str_cli:server terminated prematurelly");
            }
            Write(fileno(stdout),buf,n);
        }
        if(FD_ISSET(fileno(fp),&rset))
        {
            if((n = Read(fileno(fp),buf,MAXLINE)) == 0)
            {
                stdineof=1;
                Shutdown(sockfd,SHUT_WR);//send FIN
                FD_CLR(fileno(fp),&rset);
                continue;
            }
            Writen(sockfd,buf,n);
        }

    }
}
注意此行,(n=Read(sockfd,buf,MAXLINE))外面括號不能少!否則雖然編譯器不報錯,(可能會有警告),但是是錯誤的。去掉括號則變成了一個恆成立的命題。程式也會出現問題。

相關文章