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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值