You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:38:43