C# · 12月 29, 2021

c# – 套接字只捕获输出数据包,而不是传入数据包

我在 this (frequently cited) sample project上基于一个数据包嗅探器.在实现HTTP数据包之后,我注意到我唯一收到的HTTP数据包是请求,我没有收到任何响应.

我看了很多不同的来源,但由于使用的代码是非常常见的,所以我倾向于认为这可能是本地的.

当我查看我的日志时,我看到每个数据包都有本地IP作为SourceIP,用于HTTP数据包以及到达其他端口的数据包.

我提供了一个工作示例here,您可以将其复制粘贴到LINQPad中,并显示问题(添加System.Net和System.Net.socket程序集).不要忘记以管理员身份执行LINQPad来访问套接字.

这导致在192.168.0范围内的数百个/数千个条目,共有3个IP地址异常引用了我的主机提供商(使用nslookup检查).

private readonly byte[] _data = new byte[4096]; private Socket _mainSocket;public void Capture(){ _mainSocket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.IP); _mainSocket.Bind(new IPEndPoint(GetLocalIP(),0)); var byTrue = new byte[] {1,0}; var byOut = new byte[] {1,0}; _mainSocket.IOControl(IOControlCode.ReceiveAll,byTrue,byOut); _mainSocket.EnableBroadcast = true; _mainSocket.BeginReceive(_data,_data.Length,SocketFlags.None,OnReceive,null);}private void OnReceive(IAsyncResult ar){ SocketError error; var received = _mainSocket.EndReceive(ar,out error); Parse(_data,received); _mainSocket.BeginReceive(_data,null);}private void Parse(byte[] data,int size){ var packet = new IPHeader(data,size); Console.WriteLine (packet.sourceIP.ToString());}

> Windows 8.1
> Killer e2200千兆以太网控制器(NDIS 6.30) – 最新版本的驱动程序

>昨天安装了一个独立的网卡,没有任何改变.

A post最接近我的问题的描述已经解决了我已经有的工作代码.

为什么我只能跟踪出站数据包?

解决方法 您是否尝试查看您的操作系统/独立/路由器防火墙? 经常被忽视,但防火墙对传入和传出连接有不同的规则,这可能是您的问题的原因.