当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: thank u! ......
    摘要: 今年考高程,準備買教材,但沒看到2003版的,在上海看到新版教材的同學請告知,謝謝! ......


关于select()系统调用的疑问,希望得到大家的指教

现在我建立了一个服务器端的socket,通过它来读取从客互端发来的数据,实现过程如下所示:  
  while(   1   )   {  
   
  FD_ZERO(&rfds);  
  FD_SET(fd,   &rfds);  
                   
  tv.tv_sec   =   0;  
  tv.tv_usec   =   10000;  
   
  ret   =   select(FD_SETSIZE,   &rfds,   NULL,   NULL,   &tv);  
   
  if   (   ret   >   0   )   {  
   
  if   (   FD_ISSET(fd,   &rfds)   )   {  
   
  read(fd,   buf,   10);  
   
  printf("Read   data\n");  
   
  }   else   {  
   
  printf("no   data   to   read!\n");  
                                  }  
                  }  
  }  
      上述代码我希望实现的功能是:   如过客互端有数具发过来,那么服务器端就读取数据;否则就不读.但是执行结果确不是我所希望的.  
   
      问题一:   建立好连接后,printf("no   data   to   read!\n")语句从来不会被执行到,如果有数据发过来,read语句正常读数据,否则就会阻塞在该语句.(我所希望的是,如果没有数据发过来,根本就不去读数据,输出"no   data   to   read!").  
   
      问题二:   客互端断开后,printf("no   data   to   read!\n")语句还是不会被执行到(这时我所希望的结果是一直输出"no   data   to   read!";而事实是一直在输出"Read   data").  
   
      为什么不能用FD_ISSET(fd,   &rfds)来判断是否有数据输入?请高手赐教并告知解决问题的方法!!!多谢.  
   
   
   
   
   
 

NO.1   作者: assign

问题一:参数&tv是设置超时时间,用null试一试

NO.2   作者: ari

问题二:   客互端断开后,printf("no   data   to   read!\n")语句还是不会被执行到(这时我所希望的结果是一直输出"no   data   to   read!";而事实是一直在输出"Read   data").  
   
      为什么不能用FD_ISSET(fd,   &rfds)来判断是否有数据输入?请高手赐教并告知解决问题的方法!!!多谢.  
   
  为什么不能用FD_ISSET(fd,   &rfds)来判断是否有数据输入?请高手赐教并告知解决问题的方法!!!多谢.  
  ^^^^^^^^^^^^^^^^^  
  要判断读出的数据是否是零是零的话表示客户端断开的。  
  ============================  
  改为  
  int   n   =   0;  
  if   (   FD_ISSET(fd,   &rfds)   )   {  
  n   =   read(fd,   buf,   10);  
                    if   (   n   >   0   )  
  printf("Read   data\n");  
                      else  
  printf("no   data   to   read!   client   if   off   line\n");  
  }

NO.3   作者: aria

注意:   1.   你的socket   fd有没有设置成non-blocking方式   2.   印象中client断开时server端会读到0

NO.4   作者: alangxy

如果select的返回值ret>0,就说明有数据可读,当然只会进到if分支执行read语句;  
  如果客户端断连,则ret值应当为0,仍然进不了你的else分支  
   
  针对你的代码我的改进:  
  switch   (select(maxfd   +   1,   &myset,   0,   &exceptfd,   0))  
  {  
          case   -1:  
          case   0:  
  printf("no   data   to   read!\n");  
  break;  
          default:  
  if   (   FD_ISSET(fd,   &rfds)   )    
  {  
          read(fd,   buf,   10);  
                      printf("Read   data\n");  
              }                      
              break;  
  }        
   
  试试怎么样?


    摘要: 我在java.sun.com里面找了很久,没看到forte的download 地址, 我要把forte 做为j2me sdk 的 ide 辅助开发工具,书上给了 http://www.sun.com/forte/ffj 我去了无果,望指教! ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE