当前位置: 技术问答>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)来判断是否有数据输入?请高手赐教并告知解决问题的方法!!!多谢.
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");
}
为什么不能用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;
}
试试怎么样?
如果客户端断连,则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;
}
试试怎么样?