带管道的Tcpdump变慢

时间:2013-01-01 13:56:45

标签: unix buffer pipeline tcpdump

我对tcpdump的行为感到非常惊讶。我编写了简单的代码来做回声:

  
    

while(n)

         

{

         

n = fread(buf,16,1,stdin);

         

printf(“%s”,buf);

         

fflush(stdout中);

         

}

  

然后我做了类似

的事情
  
    

$ tcpdump | ./EchoTest

  

我在回声输出中得到了很多tcpdump数据包被抑制,直到有一些数量。为什么会这样?

之类的东西
  
    

$ cat file | ./EchoTest

  

  
    

$ tail -f file | ./EchoTest

         

(使用“$ echo”blabla“>>文件)

  

完美运作,我立即获得输出。有人知道如何强制tcpdump在管道中执行它的输出吗?

2 个答案:

答案 0 :(得分:1)

来自tcpdump manual page

  

<强> -l <​​/强>

     

使stdout行缓冲。如果您想在捕获数据时查看数据,则非常有用。如,

     

''tcpdump -l | tee dat''或'tcpdump -l&gt;数据&amp; tail -f dat''。

底线:tcpdump的输出被缓冲 - 你需要-l选项让它立即输出每个数据包/行。

答案 1 :(得分:1)

可能tcpdump只有你的数据包需要处理更多的流量,而且通常会减慢它的速度以及@ thkala的建议正在解决。使用-n选项加速它可以加快输出速度。

-n     Don't convert addresses (i.e., host addresses, port numbers, etc.) to names.