找回密码
 立即注册

微信扫码登录

QQ登录

只需一步,快速开始

搜索
查看: 2024|回复: 4

在C#中实现Ping

[复制链接]

23

主题

17

回帖

546

积分

三星会员

积分
546
性别
保密
发表于 2009-12-8 14:10:09 | 显示全部楼层 |阅读模式
在C#中实现Ping,代码如下:
using System;using System.Drawing;using System.Collections;using System.Data;using System.Net;using System.Net.Sockets;///        Ping类public class Ping{//声明常量const int SOCKET_ERROR = -1;const int ICMP_ECHO = 8;// 程序入口public static void Main(){    Ping p = new Ping();    Console.WriteLine("请输入要 Ping 的IP或者主机名字:");    string MyUrl = Console.ReadLine();    Console.WriteLine("正在 Ping " + MyUrl + " ……");    Console.Write(p.PingHost(MyUrl));}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    for (int i = 0; i < PingData; i++)    {        packet.Data = (byte)'#';    }    //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 =            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,    Int32 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);}}/// 类结束/// <summary>///        Class that holds the Pack information/// </summary>public class IcmpPacket{public Byte  Type;    // type of messagepublic Byte  SubCode;    // type of sub codepublic UInt16 CheckSum;   // ones complement checksum of structpublic UInt16 Identifier;      // identifierpublic UInt16 SequenceNumber;     // sequence numberpublic Byte [] Data;} // class IcmpPacket
QQ交流:357700106 http://www.embedcn.com
回复

使用道具 举报

1398

主题

3万

回帖

14万

积分

荣誉会员

要珍惜身边的人,心里永远记着那

积分
144926

枞阳234社区帅哥勋章灌水天才奖优秀斑竹奖爱心天使勋章

QQ
性别
发表于 2009-12-8 15:17:45 | 显示全部楼层
一点都看不懂
花开,花落,星光闪耀!
回复 支持 反对

使用道具 举报

53

主题

3693

回帖

1万

积分

五星会员

积分
13122
性别
保密
发表于 2009-12-8 18:00:31 | 显示全部楼层
天文,欣赏不了。
回复 支持 反对

使用道具 举报

1440

主题

2万

回帖

7万

积分

社区总版主

积分
79972

优秀斑竹奖爱心天使勋章枞阳234社区美女勋章

QQ
性别
发表于 2009-12-8 18:20:17 | 显示全部楼层
     真讨厌,发这样的东西!   
毋意,毋必,毋固,毋我。
回复 支持 反对

使用道具 举报

187

主题

961

回帖

5486

积分

五星会员

积分
5486
QQ
性别
发表于 2009-12-8 18:32:37 | 显示全部楼层
看的我头都晕了
[fly]香港幸福狐狸内衣赶紧V我吧xf657013581[/fly]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|发图教程|( 皖ICP备19025135号-3|皖公安备案号34082302000108 )|网站地图

GMT+8, 2025-5-4 17:06

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表