UNIX网络编程学习(14)使用select正确处理EOF的str_cli函数修订版

#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))外面括号不能少!否则虽然编译器不报错,(可能会有警告),但是是错误的。去掉括号则变成了一个恒成立的命题。程序也会出现问题。


 

原文地址:https://www.cnblogs.com/hehehaha/p/6332953.html