我在this (frequently cited) sample project上基于数据包嗅探器。在实现了HTTP数据包之后,我注意到我唯一正在拾取的HTTP数据包是请求,我没有收到任何响应。套接字只捕获传出数据包,不传入数据包
我已经看过很多不同的来源,但由于使用的代码经常是相同的,我倾向于认为它可能是本地的自己。
当我查看我的日志时,我发现每个数据包都有本地IP为SourceIP
,这两个数据包都用于HTTP数据包以及到达其他端口的数据包。
我提供了一个工作示例here,您可以将其复制粘贴到LINQPad中并显示问题(添加System.Net
和System.Net.Socket
程序集)。不要忘记以管理员身份执行LINQPad以访问套接字。
这会导致192.168.0范围内的数百/数千个条目,其中涉及我的托管提供商的IP地址总共有3个例外(使用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, 0, 0};
var byOut = new byte[] {1, 0, 0, 0};
_mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
_mainSocket.EnableBroadcast = true;
_mainSocket.BeginReceive(_data, 0, _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, 0, _data.Length, SocketFlags.None, OnReceive, null);
}
private void Parse(byte[] data, int size)
{
var packet = new IPHeader(data, size);
Console.WriteLine (packet.SourceIP.ToString());
}
- 的Windows 8.1
杀手E2200千兆以太网控制器(NDIS 6.30) - 驱动- 安装独立网卡昨日的最新版本,它并没有改变任何东西。
A post的是最接近于我的问题描述的解决方案,我已经有工作代码。
为什么我只能跟踪出站数据包?
[看起来你是对的](http://stackoverflow.com/questions/21972478/socket-is-only-catching-outgoing-packets-not-incoming-ones#comment33438735_22051702)。我从来没有想过要关掉它,看看会发生什么,我只是在看设置。 –
我很高兴我的帮助:) –