我在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)。我從來沒有想過要關掉它,看看會發生什麼,我只是在看設置。 –
我很高興我的幫助:) –