在C#中使用IP协议上的原始套接字读取传入的数据包

时间:2011-06-13 18:47:32

标签: c# sockets tcp ip

我正在尝试读取已启用标头的原始套接字上的传入数据包。看看其他项目,比如CodeProject上的MJsniffer,我已经能够创建自己的代码来读取我想要的所有内容。问题:我只检索OUTGOING的信息。这是我的初始化原始套接字的代码,此时处理代码无关紧要..

// Resolve the host name or IP address to am IPHostEntry instance
IPHostEntry hIPHostEntry = Dns.GetHostEntry( Dns.GetHostName());

// Initialize a new instance of the Socket class.
Socket hSocket = new Socket( AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified ); // IP is possible.

// Bind the socket to each resolved IP address.
foreach ( IPAddress hIPAddress in hIPHostEntry.AddressList ) try { hSocket.Bind( new IPEndPoint( hIPAddress, 0 )); } catch( Exception ) { continue; }

// Configure the incoming socket to accept all the required information.
hSocket.SetSocketOption( SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true );

// Configure the incoming socket to receive all the required information.
hSocket.IOControl( IOControlCode.ReceiveAll, BitConverter.GetBytes( 1 ), BitConverter.GetBytes( 1 ));

// Return the configured socket.
return hSocket;

在Windows 7 64位上运行,我有完整的管理权限,如何修改此代码以获得能够读取传入数据包的套接字?传出很好,我也需要它,但我也绝对需要传入数据包。

P.S:我不想强迫用户安装WinPcap。我不想捕获或欺骗或任何东西,只需阅读,这应该是可能的..

2 个答案:

答案 0 :(得分:1)

这可能不再对你有所帮助,但对其他任何人都有帮助:

在花了太多时间自己看这个之后,我自己运行了可执行文件,而不是通过Visual Studio。来港交通,太神奇了!然后我将VS debug .exe(MJSniff.vshost.exe)添加到我的防火墙中允许的程序中,现在也可以使用。 (这总是很简单的事情......)

编辑:还记得Joe Mattioni的回答: Unable to read incoming responses using raw sockets

答案 1 :(得分:0)

出于调试目的,您是否尝试过绑定到IPAddress.Any?这样,您将只有一个绑定到所有本地接口。

此外,您使用的是Receive()还是ReceiveFrom(),无连接套接字应为ReceivedFrom()