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

问题描述 投票:0回答:3

我的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 单位。

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

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

c linux sockets tcp posix-select
3个回答
3
投票

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

如果您需要避免为每个数据包调用 gettimeofday() 的开销,您可以尝试一下 libevent,因为它支持缓存的 gettimeofday() (有一点增量,具体取决于数据包处理程序运行的时间)。有关 event_base_gettimeofday_cached() 的更多信息,请参阅 http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html

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


2
投票

select()
返回之前,套接字已准备好纳秒。现在已经准备好了。 select()
 不需要等待一堆套接字准备好。


-1
投票
文件描述符准备就绪的时间戳是文件描述符的修改时间。 或者换句话说,文件描述符所代表的文件最后一次修改的时间。

可以使用 fstat() 方法获取文件的修改时间(由文件描述符表示)。 请阅读

http://pubs.opengroup.org/onlinepubs/009695399/functions/fstat.html 了解详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.