【问题标题】:C# Raw socket Receiving packetsC#原始套接字接收数据包
【发布时间】:2012-01-13 06:34:03
【问题描述】:

目前正在尝试实现一个简单的 ping 程序,以自学 C# 和 .NET 中的网络编程。

我已经成功地初始化了一个原始套接字并正确地构建了一个 ICMP 回显请求数据包。运行我的程序时,Wireshark 确认我正在向所需目的地发送 Echo 请求,但是远程机器永远不会发回 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);

如果有人能提出远程机器不发送任何回复的任何原因,我将不胜感激。

【问题讨论】:

  • 即使 Wireshark 将其识别为 ICMP 回显请求,数据包也一定有问题。最可能想到的罪魁祸首是标头校验和(IP 和 ICMP)。你检查过那些吗? Wireshark 应该告诉你它是否认为它们是正确的。
  • 您发送的请求与 windows ping 实用程序发送的请求之间有什么区别吗?你也可以用wireshark嗅探那些。如果您发现差异,您可能会发现您的问题。
  • 您可能会发现检查 Microsoft 的 Ping 实现会提供有用的信息。见\Source\.Net\4.0\DEVDIV_TFS\Dev10\Releases\RTMRel\ndp\fx\src\Net\System\Net\NetworkInformation\ping.cs 来自the reference source
  • 原来校验和没有正确分配给我的数据包。非常感谢大家的建议!

标签: c# sockets icmp


【解决方案1】:

从您问题中的信息中很难确定。有太多事情可能出错。但这里有一些我会开始检查的。

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

【讨论】:

  • 我建议使用框架Ping 类实现来验证最后两个要点。如果框架Ping 有效,则很可能是您的应用程序中存在错误。如果框架Ping失败,很可能是配置问题。
【解决方案2】:

您必须自己构建数据包吗?否则有Ping类

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

【讨论】:

  • OP 似乎将此作为学习练习。使用现有的类会破坏目的
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多