我的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 单位。
因此,文件描述符准备就绪的时间变得很重要。
我想知道如何获取文件描述符准备就绪的时间戳。
答案 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了解详情。