2011-01-30 32 views
2

我想通过监听原始套接字通过代码从网站读取响应,但迄今为止,我只能读取由我的计算机发送的传出请求,而不是我真正感兴趣的即将到来的回复。 我该如何去阅读传入的回复?无法使用原始套接字读取传入响应

编辑:使用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] 
     ); 
    } 
} 
+0

新的IPEndPoint(localIP,0)指定您要侦听端口0.是否是远程服务器连接的端口? – 2011-01-30 03:35:43

+0

@RobertLevy - `new IPEndPoint(localIP,0)`指定你不关心你使用的是什么本地端口。当(如果)你需要一个时,系统将选择一个。 (绑定,发送,接收,...)对于设置了ReceiveAll的RAW套接字,您永远不需要一个,因为您正在接收所有内容。 – 2015-03-23 04:34:31

回答

4

端口0说,他将听取所有端口上,我认为你需要设置ProtocolType.Unspecified而不是ProtocolType.IP。

new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw); 是从我在msdn上读取的ipv6中获得的ProtocolType.IP支持带有原始套接字的ipv4。

另外我认为这是一个无连接套接字的权利? 回收不会真的有一个影响,除非是这种情况。

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

希望这有助于:)

+0

在条件内我将字节数组转换为一个字符串,我已经能够轻松地匹配Firebug中的Net选项卡。根据您提出的更改,我现在正在获得一些传入流量,尽管我的程序仍然没有看到我在Firebug中看到的响应。我相信这是无连接的,尽管我昨天才开始研究套接字。 – CosworthTC 2011-01-30 15:00:20

1

我使用基本相同的原始套接字在我的C有类似的问题++程序: 如果您选择的IP头之后ü可以通过建立这样的代码得到它建立。就我而言,我可以在调试版本中看到传入数据包,但不能在发布版本中看到。在两个版本中都可以看到传出数据包。我没有在这个程序中发送任何数据包。

我在Win7 x64下用VS2008原生C++编译。

我的问题是与防火墙。当在VS中创建项目时,它显然会在防火墙中为项目构建的网络访问设置一个“允许”条目,但仅限于程序的调试版本。

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

1

今天我想知道如何做同样的事情!这里是我的代码现在似乎工作,因为得到这个工作的功劳是由于同事回答“汤姆埃里克”建议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); 
    }