您的位置:首页 > 理论基础 > 计算机网络

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

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


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐