C# 在C中使用IP协议上的原始套接字读取传入数据包#
我试图在启用了头的原始套接字上读取传入的数据包。看看其他项目,比如CodeProject上的MJSiffer,我已经能够创建自己的代码来阅读我想要的一切。问题是:我只检索传出的信息。这是我初始化原始套接字的代码,处理代码在这一点上是无关的C# 在C中使用IP协议上的原始套接字读取传入数据包#,c#,sockets,tcp,ip,C#,Sockets,Tcp,Ip,我试图在启用了头的原始套接字上读取传入的数据包。看看其他项目,比如CodeProject上的MJSiffer,我已经能够创建自己的代码来阅读我想要的一切。问题是:我只检索传出的信息。这是我初始化原始套接字的代码,处理代码在这一点上是无关的 // Resolve the host name or IP address to am IPHostEntry instance IPHostEntry hIPHostEntry = Dns.GetHostEntry( Dns.GetHostName());
// 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;
在64位Windows 7上运行,我拥有完全的管理权限,如何修改此代码以使套接字能够读取传入的数据包?传出很好,我也需要它,但我绝对需要传入的数据包
附言:我不想强迫用户安装WinPcap。我不想捕获、欺骗或其他任何东西,请阅读,这应该是可能的。出于调试目的,您是否尝试绑定到
IPAddress。是否改为绑定到IPAddress?这样,您将有一个绑定到所有本地接口
另外,如果您使用的是Receive()
或ReceiveFrom()
,则对于无连接套接字,它应该是ReceivedFrom()
。这可能不再对您有帮助,但对于其他任何人:
在我自己花了太多时间研究这个问题之后,我自己运行了这个可执行文件,而不是通过VisualStudio。来袭的交通,太棒了!然后,我将VS debug.exe(MJSNFF.vshost.exe)添加到防火墙中允许的程序中,现在也可以使用了。(总是简单的事情…)
编辑:乔·马蒂奥尼在这里的回答也值得称赞:
谢谢您的回答。使用IPAddress.Any的原始套接字将引发异常,因为这显然是不允许的。我试着用BeginReceiveFrom而不是BeginReceive接收,但结果是一样的。只找到传出数据包。欢迎提供更多信息。谢谢分享!这对我现在没有什么特别的帮助,但对未来,对任何在这个问题上遇到困难的人来说,这都是一个很好的知识。