Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在udp for linux中使用select api_C_Sockets_Select_Timer_Udp - Fatal编程技术网

如何在udp for linux中使用select api

如何在udp for linux中使用select api,c,sockets,select,timer,udp,C,Sockets,Select,Timer,Udp,上面是udp层通过ip地址和端口号从客户端接收数据的服务器代码。我使用select api通过端口检查是否有数据,然后接收数据,否则调用计时器功能。我想实现从客户端接收数据的功能,接收数据后我必须调用计时器。但是上面的代码没有调用计时器任务。以上代码中的错误是什么??使用select api是否有效???要选择的第一个参数()是三组中编号最高的FD的1+,因此应该是acceptSocket+1 (我假设您真正的问题比上面的代码更复杂,因为您可以只调用blocking recvfrom()而不必使

上面是udp层通过ip地址和端口号从客户端接收数据的服务器代码。我使用select api通过端口检查是否有数据,然后接收数据,否则调用计时器功能。我想实现从客户端接收数据的功能,接收数据后我必须调用计时器。但是上面的代码没有调用计时器任务。以上代码中的错误是什么??使用select api是否有效???

要选择的第一个参数()是三组中编号最高的FD的1+,因此应该是acceptSocket+1


(我假设您真正的问题比上面的代码更复杂,因为您可以只调用blocking recvfrom()而不必使用select()。如果您想在一个线程中处理多个套接字,和/或在超时后唤醒阻塞调用,则需要select(),尽管还有其他方法可以执行后者。)

使用
超时调用
select()
的方式将阻塞
==NULL,直到有数据要读取
主文件中的一个文件描述符为止。在您的情况下,如果
master
仅包含
acceptSocket
,将永远无法访问调用
makeTimer()
else

只检查而不阻塞

请注意,
select()。因此,您还必须改变您的状况:

struct timeval timeout;

timeout.tv_sec = 0l;
timeout.tv_usec = 0l; 
retval = select( acceptSocket+1, master, NULL, NULL, &timeout );


因为否则,你也会在超时后调用
recvfrom()
,在这种情况下,它会阻塞

还有其他解决方案吗?如果我按下面的方式给出,那么它将是5微秒-不是吗??time.tv_sec=5;time.tv_usec=1<代码>time.tv_sec=5
-->五秒。对于5微秒的等待时间,将
tv_sec
设置为0,将
tv_usec
设置为5;非常感谢你!!在调试模式下,它不是从RecvFromAPI中出来的:在RecvFromAPI之后,它不是从中出来的。为什么?我在我的回答中加了一条注释,希望能回答你的问题
struct timeval timeout;

timeout.tv_sec = 0l;
timeout.tv_usec = 0l; 
retval = select( acceptSocket+1, master, NULL, NULL, &timeout );
else if(FD_ISSET (acceptSocket, &master))
else if(retval > 0 && FD_ISSET (acceptSocket, &master))