荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: knightmare.bbs@bbs.apue.net (梦醒时分), 信区: InstallBBS
标  题: bbsnet.c的一个小错误
发信站: APUE (Tue Aug 20 11:53:39 2002)
转信站: SZUBBS!news2.happynet.org!news.tiaozhan.com!APUE

不知道是否已经修改了,因为我看到的源代码比较老
问题出现在对select的返回的判断上
bbsnet.c里面有类似这样的代码
   while(1) {
      tv.tv_sec = 2400;
      tv.tv_usec = 0;
      FD_ZERO(&readfds) ;
      FD_SET(fd,&readfds);
      FD_SET(0,&readfds);
      result = select(fd + 1,&readfds,NULL,NULL,&tv);
      if (result <= 0) break;
      if (FD_ISSET(0,&readfds)) {
         result = read(0,buf,2048);
         if (result<=0) break;
         if(result==1&&(buf[0]==10||buf[0]==13)){
            buf[0]=13;
            buf[1]=10;
            result=2;
         }
         if(buf[0]==29){close(fd);return;}
         write(fd,buf,result);
      } else {
         result=read(fd,buf,2048);
         if (result<=0) break;
         if(strchr(buf, 255)) telnetopt(fd, buf,result);
         else write(0,buf,result);
      }
   }
}
这里面用select来判断用户有输入还是telnet的socket有输入
FD_ISSET(0,&readfds)为真的时候就从STDIN_FILENO读入
假的时候就从fd读入数据,

但是这里用if else显然不合适,因为select被设定为2400秒,也就是40分钟超时
当超时的时候FD_ISSET(0,&readfds)为假,但是telnet socket上面也不一定有
数据过来,这个时候程序就会阻塞在result=read(fd,buf,2048);这一行
如果telnet socket一直没有数据传过来,那么用户所有的输入也都没有任何反应了

当然,发生这种情况的几率非常小,第一2400秒很长,第二一般bbs总是会发过来信息
但是如果是一个unix的主机,那么这种情况也是有可能发生的,我就是在把
timeout改成5秒的时候,发现了这个bug
--
※ 来源:·UNIX编程 bbs.apue.net·[FROM: 202.108.204.153]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店