我的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个单位。
因此,文件描述符准备就绪的时间变得非常重要。
我还想知道如何获得,即文件描述符成为就绪的的时间戳。
发布于 2016-02-04 12:51:24
文件描述符准备就绪的时间戳是文件描述符的修改时间。换句话说,文件描述符表示的文件上次修改的时间。
可以使用fstat()方法获得文件的修改时间(由文件描述符表示)。详细信息请阅读http://pubs.opengroup.org/onlinepubs/009695399/functions/fstat.html。
发布于 2016-02-02 14:41:23
正如@EJP已经解释的那样,select将在数据到达后返回几纳秒。然后由您调用gettimeofday()或类似的东西来获得当前时间。
如果您需要避免为每个数据包调用gettimeofday()的开销,您可以给libevent一个go,因为它支持缓存的gettimeofday() (根据您的数据包处理程序运行的时间而有一个小的增量)。有关event_base_gettimeofday_cached()的更多信息,请参见event_base_gettimeofday_cached。
如果你真的需要以尽可能高的精度到达帧的时间,你可以切换到libpcap,DPDK或netmap。它们提供帧到达的时间戳--因为您需要自己处理整个IP/TCP堆栈(您可以使用lwip或libnids)。
发布于 2016-02-02 11:26:25
套接字在select()返回之前已经准备好了纳秒。现在已经准备好了。select()不会等待一堆套接字准备就绪。
https://stackoverflow.com/questions/35149061
复制相似问题