hoterran / tcpcollect

Watch sql base libpcap
141 stars 59 forks source link

libpcap 的一处修改和 fakeNow导致断言的问题. #31

Closed hoterran closed 11 years ago

hoterran commented 11 years ago
  1. 发现一个奇怪的现象,poll 里返回数据,然后 pcap_get_ring_frame 确没拿到数据,通过pcap_stat 看到没有丢包.于是 pcap_dispatch 返回了 0 ,但并不是超时导致的.

我的目的,出现超时 3s,则 fakeNow 需要time里取,否则使用协议栈头的时间绰.

用压力程序一压,发现大量的 返回 0 ,但非超时,此时大量的调用了time,这比较消耗性能.

如果 fakeNow 不通过 time更新时间,则会有很多数据cache住,两难.

所以修改了 pcap_read_linux_mmap 一旦 poll timeout 了,直接返回 -10 ,这样 外面的程序就知道是否是真的超时了, 没有其他好方法了.

  1. time(NULL) 赋值的时候需要注意,这个 time 出来的值有可能比协议栈里的时间还早,这点很奇怪,导致了几处断言的错误. 所以fakeNow的赋值,就算是 time,也要注意比较大小