如何获取select()监视的文件描述符准备就绪的时间戳?

时间:2016-02-02 09:08:08

标签: c linux sockets select tcp

我的C程序使用 TCP套接字进行通信。

我正在使用迭代服务器和select()来监听多个文件描述符;每个客户端一个TCP套接字文件描述符。

是否有一种方法可以用来判断文件描述符何时准备就绪?

该应用程序适用于Linux平台。

应用程序就像:

我有一组文件描述符{fd1,fd2,... fdN}

while (True)
     S <-- select (fd1, fd2, ... fdN)  // Set S contains the ready fds

     S = {fd1, fd2, fd3}.
     /* Say only the file descriptors fd1, fd2 and fd3 are ready.
      * I want to process in FIFO order.
      * Hence, I need timestamp at which a file descriptor became ready.*/

     process (S)   /* It may take 2-3 minutes. Which is not negligible. 
                    * Say t units for generalization.*/

请注意,由于 t 单位需要处理文件描述符,因此 S中两个文件描述符的就绪时间之间的最大差异可以是 t 单位。

因此,文件描述符准备就绪的时间变得很重要。

我想知道如何获取文件描述符准备就绪的时间戳

3 个答案:

答案 0 :(得分:3)

正如@EJP已经解释的那样,select将在数据到达后返回几纳秒。然后你可以调用gettimeofday()或类似的东西来获取当前时间。

如果你需要避免为每个数据包调用gettimeofday()的开销,你可以给libevent一个go,因为它支持一个缓存的gettimeofday()(根据你的数据包处理程序的运行时间有一点点增量)。有关event_base_gettimeofday_cached()的详细信息,请参阅http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html

如果您真的需要帧的到达时间以尽可能高的精度,您可以切换到libpcap,DPDK或netmap。它们提供帧到达的时间戳 - 由于您需要自己处理整个IP / TCP堆栈(您可以使用lwip或libnids)的缺点。

答案 1 :(得分:2)

套接字在select()返回之前的纳秒就准备好了。现在已经准备好 select()不会等待一堆套接字准备就绪。

答案 2 :(得分:-1)

文件描述符准备就绪的时间戳是文件描述符的修改时间。 或者换句话说,上次修改文件描述符所代表的文件的时间。

可以使用fstat()方法获取文件的修改时间(由文件描述符表示)。 请阅读http://pubs.opengroup.org/onlinepubs/009695399/functions/fstat.html了解详情。