C# 无法使用原始套接字读取传入响应

C# 无法使用原始套接字读取传入响应,c#,raw-sockets,C#,Raw Sockets,我试图通过一个原始套接字通过代码读取来自网站的响应,尽管到目前为止,我只能读取计算机发送的传出请求,而不是我真正感兴趣的传入响应。 我如何阅读收到的回复 编辑:使用Wireshark,我发现我正在寻找的数据是通过TCP发送的,我相信 Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified); IPAddress localIP = Dns.GetHostBy

我试图通过一个原始套接字通过代码读取来自网站的响应,尽管到目前为止,我只能读取计算机发送的传出请求,而不是我真正感兴趣的传入响应。 我如何阅读收到的回复

编辑:使用Wireshark,我发现我正在寻找的数据是通过TCP发送的,我相信

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified);
IPAddress localIP = Dns.GetHostByName(Dns.GetHostName()).AddressList[0];
listener.Bind(new IPEndPoint(localIP, 0));
byte[] invalue = new byte[4] { 1, 0, 0, 0 };
byte[] outvalue = new byte[4] { 1, 0, 0, 0 };
listener.IOControl(IOControlCode.ReceiveAll, invalue, outvalue);
while (true)
{
    byte[] buffer = new byte[1000000];
    int read = listener.Receive(buffer);
    if (read >= 20)
    {
        Console.WriteLine("Packet from {0} to {1}, protocol {2}, size {3}",
            new IPAddress((long)BitConverter.ToUInt32(buffer, 12)),
            new IPAddress((long)BitConverter.ToUInt32(buffer, 16)),
            buffer[9],
            buffer[2] << 8 | buffer[3]
        );
    }
}
Socket侦听器=新套接字(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Unspecified);
IPAddress localIP=Dns.GetHostByName(Dns.GetHostName()).AddressList[0];
Bind(新的IPEndPoint(localIP,0));
字节[]无效=新字节[4]{1,0,0,0};
byte[]outvalue=新字节[4]{1,0,0,0};
IOControl(IOControlCode.ReceiveAll、invalue、outvalue);
while(true)
{
字节[]缓冲区=新字节[1000000];
int read=listener.Receive(缓冲区);
如果(读取>=20)
{
WriteLine(“从{0}到{1},协议{2},大小{3}的数据包”,
新的IPAddress((长)位转换器.ToUInt32(缓冲区,12)),
新的IPAddress((长)位转换器.ToUInt32(缓冲区,16)),
缓冲区[9],

缓冲区[2]端口0表示他将侦听所有端口,我认为您需要将ProtocolType.Unspecified设置为ProtocolType.IP

newsocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Raw);
根据我在msdn上读到的内容,是针对ipv6的。对于带有原始套接字的ipv4,只支持ProtocolType.IP

我想这是一个无连接的插座,对吗? 除非是这样,否则Reciveall不会真正产生影响。 如果您正在查找ip头,您可以通过如下设置代码来获取:

Socket sck = new Socket( AddressFamily.InterNetwork  , SocketType.Raw  , ProtocolType.IP);
   sck.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);  

希望这有助于:(

< p>)我在C++程序中使用了基本相同的原始套接字设置,也有类似的问题。在我的例子中,我可以看到调试生成中传入的数据包,但是在版本构建中没有看到。在两个构建中都会看到输出包。我不会在这个程序中发送任何包。 我在Wi7x64下用VS2008原生C++构建.< /P> 我的问题是关于防火墙的。当在VS中创建项目时,它显然在防火墙中放置了一个“允许”条目,用于项目构建的网络访问,但仅用于程序的调试构建


我必须为发布版本添加另一个条目,然后才允许传入数据包。Win7下的高级防火墙设置也会导致特定协议被阻止,因此,如果您只收到部分传入消息,请检查这些设置以获取您的程序条目。

今天我想知道如何做完全相同的事情!下面是我的代码现在似乎可以工作了,这项工作的成功归功于我的同事汤姆·埃里克(Tom Erik)提出的ProtocolType.IP

    static void Main(string[] args)
    {
        // Receive some arbitrary incoming IP traffic to an IPV4 address on your network adapter using the raw socket - requires admin privileges
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
        IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList
            .Where((addr) => addr.AddressFamily == AddressFamily.InterNetwork)
            .Where((addr) => addr.GetAddressBytes()[0] != 127)
            .First();
        s.Bind(new IPEndPoint(ipAddress, 0));
        byte[] b = new byte[2000];
        EndPoint sender = new IPEndPoint(0, 0);
        int nr = s.ReceiveFrom(b, SocketFlags.None, ref sender);
    }

new IPEndPoint(localIP,0)指定您要侦听端口0。这是远程服务器连接到的端口吗?@RobertLevy-
new IPEndPoint(localIP,0)
指定您不关心正在使用的本地端口。系统将在您需要时选择一个端口。(绑定、发送、接收,…)对于设置了ReceiveAll的原始套接字,您永远不需要它,因为您正在接收所有内容。在条件中,我将字节数组转换为字符串,我可以轻松地将其与Firebug中的Net选项卡进行匹配。通过您建议的更改,我现在获得了一点传入流量,尽管我的程序仍然没有看到我在Firebug中看到的响应。我相信这是无连接的,尽管我昨天才开始查看套接字。+1谢谢!顺便问一下,你在MSDN上从哪里找到了这些信息?请注意,使用SocketType.Raw已经意味着你将收到包含IPV4数据包的HeaderIncluded。参考: