C#Raw套接字接收数据包

时间:2012-01-12 16:00:57

标签: c# sockets icmp

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

我已设法初始化原始套接字并正确构建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);

如果有人可以提出远程机器没有发送任何回复的任何理由,我将非常感激。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);
}