C#原始套接字接收数据包

C#原始套接字接收数据包

问题描述:

当前正在尝试实现一个简单的ping程序,教我自己关于C#和.NET中的网络编程。C#原始套接字接收数据包

我设法初始化一个原始套接字并正确地建立一个ICMP回应请求数据包。在运行我的程序时,Wireshark确认我正在向所需的目标发送一个Echo请求,但是远程机器永远不会发回回应应答。我已经尝试发送到多台机器都具有相同的结果(并可以使用Windows ping实用程序ping每台机器)。我的代码是这样的:

IcmpPacket echoReq = new IcmpPacket; 
/*Some code to initialize packet*/ 
rawSocket.Send(echoReq, destinationIP); //syntax may be wrong, dont have the code infront of me sorry 
rawSocket.ReceiveFrom(buffer, remoteEndpoint); 

如果任何人都可以说明为什么在远程机器不发送任何回应任何理由,我会非常感激。

+1

即使Wireshark将其标识为ICMP回显请求,数据包也必须有问题。想到的最可能的罪魁祸首是头校验和(IP和ICMP)。你检查过那些吗? Wireshark应该告诉你它是否认为它是正确的。 – Celada 2012-01-12 16:07:43

+2

您发送的请求与Windows Ping实用程序发送的请求之间是否有区别?你也可以用wireshark来嗅探那些人。如果你发现差异,你可能会发现你的问题。 – AVee 2012-01-12 16:08:08

+0

您可能会发现检查Microsoft的“Ping”实现是否有用。请参阅[参考源](http://referencesource.microsoft)中的\ Source \ .Net \ 4.0 \ DEVDIV_TFS \ Dev10 \ Releases \ RTMRel \ ndp \ fx \ src \ Net \ System \ Net \ NetworkInformation \ ping.cs .com/netframework.aspx) – Brian 2012-01-12 18:13:47

很难确切知道在你的问题中的信息。有太多事情可能会出错。但是,我会开始检查一些内容。

  • ICMP数据包可能被错误地格式化。我将使用wireshark将自定义ping数据包的结果与已知功能实用程序的结果进行比较,以查看是否有任何差异
  • destinationIPremoteEndpoint值可能指向不同的地址。似乎不太可能,但想叫出来
  • 有问题的IP可能只是拒绝ping请求。我会验证与另一个工具,它是返回ping
  • 防火墙可能会阻碍。我会暂时禁用它,然后重新运行我的程序以查看是否是原因。
+1

我会建议使用框架['Ping'](http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx)类实现验证最后两个要点。如果框架'Ping'有效,那么这很可能是您的应用程序中的一个错误。如果框架'Ping'失败,则很可能是配置问题。 – Brian 2012-01-12 18:18:11

您是否需要构建自己的数据包?还有就是平级的,否则

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

编辑:

Ping pingSender = new Ping(); 
PingReply reply = pingSender.Send ("www.contoso.com"); 

if (reply.Status == IPStatus.Success) 
{ 
    Console.WriteLine ("Address: {0}", reply.Address.ToString()); 
    Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime); 
    Console.WriteLine ("Time to live: {0}", reply.Options.Ttl); 
    Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment); 
    Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length); 
} 
else 
{ 
    Console.WriteLine (reply.Status); 
} 
+1

该OP似乎是做这个学习练习。使用现有的类将打败目的 – JaredPar 2012-01-12 16:07:38