关于tcpdump和文件管道打开的问题

关于tcpdump和文件管道打开的问题

关于tcpdump和文件管道打开的问题
我最近写个程序,目的是为了采集tcpdump输出的东西,取得需要的ip来操作,我采用
open (TCPD,"tcpdump -arp |")这种方式管道打开
然后通过
while(<TCPD>)来读取每一行,希望能在while中对每一行进行模式匹配,得到ip地址,但是
事与愿违,我发现一个很郁闷的问题
用<>操作符来得到TCPD的时候,等待很长时间都没有反应,我用调试模式发现,如果我中止了<>的操作,那么while里面就能运行,感觉有点像<>有个缓冲什么的,我试着用类似$|=1这种方式打开立即发送模式,但是似乎没有作用
问题是:
1。我想知道如何实时得到TCPD的输出,用来处理,它输入一个我就处理一个,<>操作似乎不行
2。能有什么方法来实现这一功能呢?
请求赐教
另外我看到raw_ip似乎可以得到类似tcpdump功能的东西,但是不会用,也许我思路不对,希望能指点一二
那位兄弟知道阿,5555555.
呵呵,用强大的pipe咯~ 呵呵,用强大的pipe咯~
给你写了个例子,fork出一个子进程来调用tcpdump,使用pipe函数建立IN,OUT这样一个联系的管道,父进程和子进程相当于两个空间,而这两个空间由IN,OUT这两个句柄连通,子进程这头是OUT,父进程那头是IN,子进程往OUT写数据,父进程就可以从IN取到数据。程序很简单,你根据自己的需求稍微修改一下就OK了~~

[quote]
#!/usr/bin/perl
#cnhackTNT [at] perlchina.org

$|++;
$SIG{INT}=sub{die "Byebye!\n"};

pipe(IN,OUT) or die "Can not open pipe: $!\n";

if(fork == 0){
close IN;
select OUT;
++$|;
open(FH,"tcpdump|") or die "Can not call tcpdump :$!\n";
print while(<FH>); #这句修改一下,改成你想要的,对tcpdump截获数据的处理过程
close FH;
exit 0;
}
close OUT;
print "===>$_" while <IN>;
[/quote]
非常感谢,我明白你意思了.
非常感谢,我明白你意思了,我先试试看。应该可以
$|++;--++$|;--是什么.
$|++;
++$|;
是什么意思呢
我测试了,但是还是不能实.
我测试了,但是还是不能实时的发送到另外一边,郁闷了
$|++ 和 ++$| 均是关闭IO缓冲的
另外,在我的机器上,我的那段代码是ok的,只要tcpdump抓到数据,父进程就会打印
我的系统是 ubuntu linux 。
难道你的机器是windows?
我也是linux,我觉得问题还是在关闭缓冲的地方
我测试过,她要等上一段时间才显示一大串接过,
我用的代码是你的一抹一样还是这样子的,真是奇怪
我市rhl-inux关闭缓冲这样子可以吗?
$|=1;
终于解决了。joepurl兄告知
tcpdump有-l参数是关闭输出缓存,哈哈,这就是问题所在了
congratulations~~!--:-.
congratulations~~!
:-)