Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用IP协议上的原始套接字读取传入数据包#_C#_Sockets_Tcp_Ip - Fatal编程技术网

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

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());

我试图在启用了头的原始套接字上读取传入的数据包。看看其他项目,比如CodeProject上的MJSiffer,我已经能够创建自己的代码来阅读我想要的一切。问题是:我只检索传出的信息。这是我初始化原始套接字的代码,处理代码在这一点上是无关的

// 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接收,但结果是一样的。只找到传出数据包。欢迎提供更多信息。谢谢分享!这对我现在没有什么特别的帮助,但对未来,对任何在这个问题上遇到困难的人来说,这都是一个很好的知识。