以下是源代码,建一个控制台程序,然后把代码Copy进去就可以了~~

using System; using System.Collections; using System.Data; using System.Net; using System.Net.Sockets; namespace PPing { /// <summary> /// Summary description for Class. /// </summary> /// Ping类 class Ping { //声明常量 const int SOCKET_ERROR = -1; const int ICMP_ECHO = 8; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] // 程序入口 static void Main(string[] args) { // // TODO: Add code to start application here // Ping p = new Ping(); Console.WriteLine("请输入要 Ping 的IP或者主机名字:"); string MyUrl = Console.ReadLine(); Console.WriteLine("正在 Ping " + MyUrl + " ……"); Console.Write(p.PingHost(MyUrl)); Console.WriteLine(); Console.ReadLine(); } public string PingHost(string host) { // 声明 IPHostEntry IPHostEntry serverHE, fromHE; int nBytes = 0; int dwStart = 0, dwStop = 0; //初始化ICMP的Socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000); // 得到Server EndPoint try { serverHE = Dns.GetHostByName(host); } catch(Exception) { return "没有发现主机"; } // 把 Server IP_EndPoint转换成EndPoint IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0); EndPoint epServer = (ipepServer); // 设定客户机的接收Endpoint fromHE = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0], 0); EndPoint EndPointFrom = (ipEndPointFrom); int PacketSize = 0; IcmpPacket packet = new IcmpPacket(); // 构建要发送的包 packet.Type = ICMP_ECHO; //8 packet.SubCode = 0; packet.CheckSum = UInt16.Parse("0"); packet.Identifier = UInt16.Parse("45"); packet.SequenceNumber = UInt16.Parse("0"); int PingData = 32; // sizeof(IcmpPacket) - 8; packet.Data = new Byte[PingData]; // 初始化Packet.Data string Tempstr=@"http://xml.sz.luohuedu.net/xml/#"; for (int i = 0; i < PingData; i++) { packet.Data[i] =(byte)Tempstr[i]; } //Variable to hold the total Packet size PacketSize = PingData + 8; Byte [] icmp_pkt_buffer = new Byte[ PacketSize ]; Int32 Index = 0; //Call a Method Serialize which counts //The total number of Bytes in the Packet Index = Serialize( packet, icmp_pkt_buffer, PacketSize, PingData ); //Error in Packet Size if( Index == -1 ) { return "Error Creating Packet"; } // convert into a UInt16 array //Get the Half size of the Packet Double double_length = Convert.ToDouble(Index); Double dtemp = Math.Ceiling( double_length / 2); int cksum_buffer_length = Convert.ToInt32(dtemp); //Create a Byte Array UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length]; //Code to initialize the Uint16 array int icmp_header_buffer_index = 0; for( int i = 0; i < cksum_buffer_length; i++ ) { cksum_buffer[i] =BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index); icmp_header_buffer_index += 2; } //Call a method which will return a checksum UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length); //Save the checksum to the Packet packet.CheckSum = u_cksum; // Now that we have the checksum, serialize the packet again Byte [] sendbuf = new Byte[ PacketSize ]; //again check the packet size Index = Serialize( packet, sendbuf, PacketSize, PingData ); //if there is a error report it if( Index == -1 ) { return "Error Creating Packet"; } dwStart = System.Environment.TickCount; // Start timing //send the Packet over the socket if ((nBytes = socket.SendTo(sendbuf, PacketSize, 0, epServer)) == SOCKET_ERROR) { return "Socket Error: cannot send Packet"; } // Initialize the buffers. The receive buffer is the size of the // ICMP header plus the IP header (20 bytes) Byte [] ReceiveBuffer = new Byte[256]; nBytes = 0; //Receive the bytes bool recd =false ; int timeout=0 ; //loop for checking the time of the server responding while(!recd) { nBytes = socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom); if (nBytes == SOCKET_ERROR) { return "主机没有响应" ; } else if(nBytes>0) { dwStop = System.Environment.TickCount - dwStart; // stop timing return "Reply from "+epServer.ToString()+" in " +dwStop+"ms. Received: "+nBytes+ " Bytes."; } timeout=System.Environment.TickCount - dwStart; if(timeout>1000) { return "超时" ; } } //close the socket socket.Close(); return ""; } /// <summary> /// This method get the Packet and calculates the total size /// of the Pack by converting it to byte array /// </summary> public static Int32 Serialize(IcmpPacket packet, Byte[] Buffer, I nt32 PacketSize, Int32 PingData ) { Int32 cbReturn = 0; // serialize the struct into the array int Index=0; Byte [] b_type = new Byte[1]; b_type[0] = (packet.Type); Byte [] b_code = new Byte[1]; b_code[0] = (packet.SubCode); Byte [] b_cksum = BitConverter.GetBytes(packet.CheckSum); Byte [] b_id = BitConverter.GetBytes(packet.Identifier); Byte [] b_seq = BitConverter.GetBytes(packet.SequenceNumber); Array.Copy( b_type, 0, Buffer, Index, b_type.Length ); Index += b_type.Length; Array.Copy( b_code, 0, Buffer, Index, b_code.Length ); Index += b_code.Length; Array.Copy( b_cksum, 0, Buffer, Index, b_cksum.Length ); Index += b_cksum.Length; Array.Copy( b_id, 0, Buffer, Index, b_id.Length ); Index += b_id.Length; Array.Copy( b_seq, 0, Buffer, Index, b_seq.Length ); Index += b_seq.Length; // copy the data Array.Copy( packet.Data, 0, Buffer, Index, PingData ); Index += PingData; if( Index != PacketSize/* sizeof(IcmpPacket) */) { cbReturn = -1; return cbReturn; } cbReturn = Index; return cbReturn; } /// <summary> /// This Method has the algorithm to make a checksum /// </summary> public static UInt16 checksum( UInt16[] buffer, int size ) { Int32 cksum = 0; int counter; counter = 0; while ( size > 0 ) { UInt16 val = buffer[counter]; cksum += Convert.ToInt32( buffer[counter] ); counter += 1; size -= 1; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); return (UInt16)(~cksum); } } /// 类结束 public class IcmpPacket { public Byte Type; // type of message public Byte SubCode; // type of sub code public UInt16 CheckSum; // ones complement checksum of struct public UInt16 Identifier; // identifier public UInt16 SequenceNumber; // sequence number public Byte [] Data; } // class IcmpPacket }

C#实现Ping命令相关推荐

  1. 响应因特网端口ping命令_如何使用Ping命令识别基本的Internet问题

    响应因特网端口ping命令 Next time you call your help desk, do you want to wow them with your networking knowle ...

  2. ping命令使用及其常用参数

    PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量检查网络是否连通,可以很好地帮助我们分析和判定网络故障.Ping发送一个ICMP(Internet Con ...

  3. ping 命令还能这么玩?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 小Hub领读: 说实话,我以为ping就仅仅用来判断网络通不通,哈 ...

  4. Ping命令 参数介绍!

    Ping命令详解 对于Windows下ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,当然我也并不是说我可以让ping发挥最大的功能,我也只不过经常用ping这 ...

  5. 局域网连接其他机器命令_弱电工程师必备技能,PING命令使用方法大全

    做弱电的工程人员都知道,在这个数字化网络时代,要学会一些网络常用命令,有了它们,可以快速排查出问题,Ping就是最基础命令之一,Ping是使用最常用的网络测试命令,主要用于确定网络的连通性.下面是学习 ...

  6. linux ping程序设计与实现,一步步学Linux网络编程--ping命令的实现分析

    先来说说ping程序的原理吧,其实挺简单,就是一个主机系统向另外一个主机系统说:I love you(ICMP报文),然后那个主机如果相信你或者说想和你通信,和你心知心,那它就把收到的I love y ...

  7. 完全解读ping命令应用方法

    Ping的使用可以帮助我们了解终端与终端,终端与主机之间是否连通以及详细数据的的测试工具.合理,正确使用Ping命令,可以让我们了解很多这方面的知识. 我想大多数网虫对ping这个命令一定不陌生吧,它 ...

  8. Ping命令为什么要加上“-t”参数

    Ping命令为什么要加上"-t"参数 最佳答案: 没有说一定要加啊!是看你的意愿,你要是想一直ping下去就加–t,直到按control+c键停止为止

  9. 使用C#调用外部Ping命令获取网络连接情况

    以前在玩Windows 98的时候,几台电脑连起来,需要测试网络连接是否正常,经常用的一个命令就是Ping.exe.感觉相当实用. 现在 .Net为我们提供了强大的功能来调用外部工具,并通过重定向输入 ...

  10. php ping 命令注入,CTF关于ping命令注入问题

    题目样式 对于看到ping或者ping命令却没有弄waf时就要想到命令注入. 具体注入方法 看到ping命令就可以利用截断来执行新的命令. 首先测试所有的截断符号: '$' ';' '|' '-' ' ...

最新文章

  1. [Java]Thinking in Java 练习2.10
  2. 【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
  3. Simple DNS Plus 5.2 build 117
  4. [LeetCode] 3. Longest Substring Without Repeating Characters 题解
  5. 论文浅尝 | Knowledge Vault: 全网规模的知识概率融合方法
  6. CISCO CCNA路由器密码管理
  7. CCNA学习指南 第五章 下载
  8. 迅雷 iOS 版终于复活,不限速,完美支持BT磁力下载
  9. 《The Django Book》笔记(未完结)
  10. 流程:论文发表的流程
  11. ks3云存储本地上传限速
  12. DongDong认亲戚(map+并查集)
  13. NMS(非极大值抑制)代码构建与详解
  14. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  15. Map_Excise1
  16. 数学建模_国2000A——DNA序列问题中的数据处理
  17. Win32k.sys是什么文件
  18. 【SAP】查询所有用户信息并导出
  19. 用ControlJS优化阿里妈妈广告
  20. 2010年1月27日俱乐部活动,李开复博士与CTO俱乐部会员 讲座交流会

热门文章

  1. 文本属性之行间距(CSS、HTML)
  2. pythonmapiter_018.Python迭代器以及map和reduce函数
  3. centos nginx不是命令_Linux使用yum安装nginx服务教程
  4. PCL——连接两个点云的字段
  5. Saltstack远程执行命令(3)
  6. 机器学习技法总结(六)Decision Tree Hypothesis
  7. 图片 + 未知宽高 + 垂直居中
  8. Xamarin开发Android---提示、跳转、传递数值 (学习总结)
  9. g楦和h楦的区别_药品与保健品的区别
  10. oracle 01157,Oracle数据库启动时出现ORA-01157和ORA-01110问题