【发布时间】:2016-04-22 06:27:14
【问题描述】:
我使用 select 进行同步 I/O 多路复用。它将检查任何数据 1 秒。1 秒后如果没有数据将显示输出 (puts("Waited for 1 sec no data");) 然后它将检查再次用于数据。但这仅在第一次起作用,然后进入无限循环。
有没有其他解决方案。
//..............................
//.............................
//Creating listener socket and other sort of things
struct timeval tv;
tv.tv_sec=1;
tv.tv_usec=0;
while(1)
{
FD_ZERO(master);
FD_SET(listener,master);
fdmax = listener;
int retval=select(fdmax+1,master, NULL, NULL,&tv);
printf("retval is %d\n",retval);
if(retval == -1)
{
perror("Server-select() error");
}else if(retval)
{
puts("Data available");
//If there is no data do some work and checkagain.
}else
{
puts("Waited for 1 sec no data");
//If there is no data do some work and checkagain.
}
}
【问题讨论】:
-
timeval结构声明了超时。如果您想在 I/O 之间等待一秒钟,您应该按照@Pierre 的建议进行操作。 -
select() 超时后是否关闭套接字?
-
彻底阅读
select的手册页。它有很多提示:在 select() 返回后考虑未定义超时。 -
只需在“checkagain:”标记后加上tv initalization,请不要再使用goto
-
@Pierre 使用
sleep的目的是什么?这段代码已经做了正确的事情,除了被接受的答案纠正的错误。sleep只是增加了应用程序既不能工作也无法响应 I/O 的无用时间。
标签: c