我的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 单位。
因此,文件描述符准备就绪的时间变得很重要。
我想知道如何获取文件描述符准备就绪的时间戳。
正如@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)。
在
select()
返回之前,套接字已准备好纳秒。现在已经准备好了。 select()
不需要等待一堆套接字准备好。
可以使用 fstat() 方法获取文件的修改时间(由文件描述符表示)。 请阅读
http://pubs.opengroup.org/onlinepubs/009695399/functions/fstat.html 了解详细信息。