1

目前正在尝试实现一个简单的 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);

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

4

2 回答 2

1

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

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

您必须构建自己的数据包吗?否则有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);
}
于 2012-01-12T16:05:26.180 回答