Tshark捕获CDP包输出重定向至C#程序或文件失败问题求助
解决Tshark输出重定向(文件/C#程序)无数据的问题
你遇到的这个情况确实是Tshark在Windows环境下的常见问题——当输出不是直接指向终端(比如重定向到文件、管道或者被其他程序捕获)时,Tshark会启用全缓冲模式,而非行缓冲。这意味着它会把输出数据暂存到缓冲区,直到缓冲区满或者进程终止才会写入目标位置,而抓包进程是持续运行的,所以你只能看到初始的“Capturing on 'Ethernet'”提示,后续的包数据一直被卡在缓冲区里。
下面是针对不同场景的解决方案:
1. 命令行直接重定向到文件
在Tshark命令中添加-l参数,强制Tshark使用行缓冲模式,每抓到一个包就立即输出一行数据:
tshark -l -i Ethernet ether[16:4] = 0x0300000C and ether[20:2] == 0x2000 > cdp_output.txt
这样文件会实时写入抓到的CDP包数据,而不是等到进程结束。
2. C#控制台程序中捕获输出
你的现有代码存在两个核心问题:一是没加-l参数开启行缓冲,二是ReadToEnd()会阻塞到Tshark进程终止才返回,而抓包进程是持续运行的。修改后的代码改用异步读取来实时获取输出:
using System; using System.Diagnostics; class TsharkCDPCapture { static void Main(string[] args) { string nicName = "Ethernet"; // 替换为你的目标网卡名称 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = @"C:\tshark\tshark.exe"; // 添加-l参数开启行缓冲,确保实时输出 psi.Arguments = $"-l -i \"{nicName}\" ether[16:4] = 0x0300000C and ether[20:2] == 0x2000"; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.CreateNoWindow = true; Process tsharkProcess = new Process(); tsharkProcess.StartInfo = psi; // 注册输出数据接收事件,异步处理每一行输出 tsharkProcess.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { Console.WriteLine(e.Data); } }; tsharkProcess.Start(); // 启动异步读取标准输出 tsharkProcess.BeginOutputReadLine(); // 保持程序运行,按任意键终止抓包 Console.WriteLine("正在捕获CDP数据包,按任意键停止..."); Console.ReadKey(); tsharkProcess.Kill(); } }
关键修改说明:
- 新增
-l参数:强制Tshark每抓到一个包就立即输出,避免缓冲区积压数据。 - 使用
OutputDataReceived事件:异步监听输出流,实时打印抓到的包数据,不会阻塞主线程。 - 保留
Console.ReadKey():防止程序启动后立即退出,让Tshark能持续执行抓包操作。
关于-W参数的补充
你尝试的tshark -W "filename.txt"是错误用法:-W参数用于设置PCAP文件的缓冲区大小,正确写入PCAP格式文件应该用小写的-w参数:
tshark -i Ethernet -w cdp_capture.pcap ether[16:4] = 0x0300000C and ether[20:2] == 0x2000
不过如果你的需求是获取文本格式的输出,还是用-l配合重定向的方案更贴合需求。
内容的提问来源于stack exchange,提问作者Caspi
相关产品推荐
相关产品推荐

