当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2015-02-21

    本文导语:  现在我建立了一个服务器端的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, &t...

现在我建立了一个服务器端的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 datan");

} 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)来判断是否有数据输入?请高手赐教并告知解决问题的方法!!!多谢.






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

|
问题二: 客互端断开后,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 datan");
          else
printf("no data to read! client if off linen");
}

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

|
如果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 datan");
       }           
       break;
}   

试试怎么样?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • select 疑问
  • select函数疑问
  • 关于select的疑问
  • 关于I/O复用 select的函数的疑问
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selected定义及介绍
  • 究竟怎么样取得的<select name="select_user" size="8" multiple>值
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selectable定义及介绍
  • man select 结果返回 No manual entry for select
  • java命名空间javax.swing.tree类defaulttreeselectionmodel的类成员方法: selection定义及介绍
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • java命名空间javax.swing.tree类defaulttreecellrenderer的类成员方法: selected定义及介绍
  • insert into select和select into的使用和区别介绍
  • java命名空间java.awt.event类itemevent的类成员方法: selected定义及介绍
  • JDBC里select sum和select返回的字段类型不一样
  • java命名空间javax.swing类defaultbuttonmodel的类成员方法: selected定义及介绍
  • sql代码:select database select all table
  • java命名空间javax.swing.text.html类html.tag的类成员方法: select定义及介绍
  • Oracle中select 1和select *的区别
  • java命名空间javax.swing.text.html类html.attribute的类成员方法: selected定义及介绍
  • jquery下拉select控件操作方法分享(jquery操作select)
  • java命名空间javax.swing.plaf.synth接口synthconstants的类成员方法: selected定义及介绍
  • 关于select的疑问 iis7站长之家
  • java命名空间javax.sound.midi类shortmessage的类成员方法: song_select定义及介绍
  • select into 和 insert into select 两种表复制语句
  • java命名空间javax.swing类jfilechooser的类成员方法: cancel_selection定义及介绍
  • select into与insert into select 表复制语句学习实例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3