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