无法使用原始套接字读取传入响应
我想通过监听原始套接字通过代码从网站读取响应,但迄今为止,我只能读取由我的计算机发送的传出请求,而不是我真正感兴趣的即将到来的回复。 我该如何去阅读传入的回复?无法使用原始套接字读取传入响应
编辑:使用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说,他将听取所有端口上,我认为你需要设置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);
希望这有助于:)
在条件内我将字节数组转换为一个字符串,我已经能够轻松地匹配Firebug中的Net选项卡。根据您提出的更改,我现在正在获得一些传入流量,尽管我的程序仍然没有看到我在Firebug中看到的响应。我相信这是无连接的,尽管我昨天才开始研究套接字。 – CosworthTC 2011-01-30 15:00:20
我使用基本相同的原始套接字在我的C有类似的问题++程序: 如果您选择的IP头之后ü可以通过建立这样的代码得到它建立。就我而言,我可以在调试版本中看到传入数据包,但不能在发布版本中看到。在两个版本中都可以看到传出数据包。我没有在这个程序中发送任何数据包。
我在Win7 x64下用VS2008原生C++编译。
我的问题是与防火墙。当在VS中创建项目时,它显然会在防火墙中为项目构建的网络访问设置一个“允许”条目,但仅限于程序的调试版本。
我不得不为发布版本添加另一个条目,然后允许传入数据包。 Win7下的高级防火墙设置也可能会导致特定的协议被阻止,所以如果您只收到部分收到的消息,请检查您的程序条目的设置。
今天我想知道如何做同样的事情!这里是我的代码现在似乎工作,因为得到这个工作的功劳是由于同事回答“汤姆埃里克”建议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);
}
新的IPEndPoint(localIP,0)指定您要侦听端口0.是否是远程服务器连接的端口? – 2011-01-30 03:35:43
@RobertLevy - `new IPEndPoint(localIP,0)`指定你不关心你使用的是什么本地端口。当(如果)你需要一个时,系统将选择一个。 (绑定,发送,接收,...)对于设置了ReceiveAll的RAW套接字,您永远不需要一个,因为您正在接收所有内容。 – 2015-03-23 04:34:31