新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → ping by csharp 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2327 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: ping by csharp 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18407
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    兴趣:
    * XML相关技术
    * 资料收集
    * Ontology Engineering
    * Web架构
    * SW Implementation
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 Dot NET,C#,ASP,VB 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 ping by csharp


    发信人: walts (休息一会), 信区: DotNET        
    标  题: ping by csharp
    发信站: BBS 水木清华站 (Wed Jul 25 18:51:50 2001)


      http://www3.ccw.com.cn/club/bbs/bbsView.asp?essenceID=3403

    namespace Cornfield
    {
      using System;
      using System.Net;
      using System.Net.Sockets;
      class MyPing
      {
        public static void Main(string[] argv)
        {
              if(argv.Length==1 || argv.Length==2)
            PingHost(argv);
             else
              {
            Console.WriteLine("Invalid Command.");
            Console.WriteLine("Usage : 1. MyPing <hostname>.") ;
            Console.WriteLine("       2. MyPing <hostname> <client>.");
              }
        }
        public static void PingHost(string[] hostclient)
        {
        file://初始化Socket套接字
        file://三个参数分别为:
        //    1。解析地址的地址模式,较常用的为AddressFamily.InterNetwork,即IPv
    4地址。
        //    2。Socket套接字类型,一般为SocketType.Raw原始类型。
        //    3。网络协议类型,这里Ping用的是Internet控制报文协议ProtocolType.Ic
    mp.
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, P
    rotocolType.Icmp);
        IPHostEntry hostInfo;
        try
        {
          file://解析主机IP入口
          hostInfo = Dns.GetHostByName(hostclient[0]);
        }
        catch(Exception)
        {
          file://解析主机名错误。
          Console.WriteLine("Unknown host {0}.",hostclient[0]);
          return ;
        }
        // 取主机0号端口
        EndPoint hostPoint= (EndPoint)new IPEndPoint(hostInfo.AddressList[0], 0)
    ;
        IPHostEntry clientInfo;
        try
        {
            if (hostclient.Length==2)
                clientInfo =Dns.GetHostByName(hostclient[1]);
            else
                  clientInfo = Dns.GetHostByName(Dns.GetHostName());
        }
        catch(Exception)
        {
          file://解析主机名错误。
          Console.WriteLine("Unknown client {1}.",hostclient[1]);
          return ;
        }
        // 取客户机0号端口
        file://********************************注意*****************************
    *
        file://这里当然可以设置为本地机或其它主机的IP,那样报文将返回到该机IP端口

        file://实际上这是黑客们惯用的手段之一,即利用报文协议来攻击远程主机
        file://便是利用这样的原理,加上多个无限次的报文攻击即可时远程主机瘫痪
        file://对于将本程序利用于非法的攻击活动,笔者概不负责!!!!!!!!!!!!!!!!
        file://*****************************************************************
    *
        EndPoint clientPoint = (EndPoint)new IPEndPoint(clientInfo.AddressList[0
    ], 0);
        file://设置ICMP报文
        int DataSize = 32; // ICMP数据包大小;
        int PacketSize = DataSize + 8;//总报文长度
            const int ICMP_ECHO = 8;
        IcmpPacket packet = new IcmpPacket(ICMP_ECHO,0,0,45,0,DataSize);
        Byte [] Buffer = new Byte[ PacketSize ];
        int index=packet.ConvertToByte(Buffer);
        file://报文出错
        if( index != PacketSize)
        {
          Console.WriteLine("There is something wrong with Packet Data !");
          return ;
        }
        int cksum_buffer_length =(int)Math.Ceiling( ((Double)index)/ 2);
        UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length];
        int icmp_header_buffer_index = 0;
        for( int i = 0; i < cksum_buffer_length; i++ )
        {
            file://将两个byte转化为一个UInt16
              cksum_buffer[i] = BitConverter.ToUInt16(Buffer,icmp_header_buffer_
    index);
              icmp_header_buffer_index += 2;
        }
        file://将校验和保存至报文里
        packet.CheckSum =IcmpPacket.SumOfCheck(cksum_buffer);
        // 保存校验和后,再次将报文转化为数据包
        Byte [] SendData = new Byte[ PacketSize ];
        index= packet.ConvertToByte(SendData);
        file://报文出错
        if( index != PacketSize)
        {
          Console.WriteLine("There is something wrong with Packet Data !");
          return ;
        }
        int nBytes=0;
        file://系统计时开始
        int startTime = Environment.TickCount;
        file://发送数据包
        if ((nBytes = socket.SendTo(SendData, PacketSize, SocketFlags.None,(EndP
    oint) hostPoint)) == -1)
        {
          Console.WriteLine("Socket can not send packet");
        }
        Byte [] ReceiveData = new Byte[256];     file://接收数据
        nBytes = 0;
        int timeout=0 ;
        int timeConsume=0;
        while(true)
        {
          nBytes = socket.ReceiveFrom(ReceiveData, 256,SocketFlags.None,ref clie
    ntPoint);
          if (nBytes == -1)
          {
            Console.WriteLine("Host not Responding") ;
            break;
          }
          else if(nBytes>0)
          {
            timeConsume = System.Environment.TickCount - startTime;
            Console.WriteLine("Reply from "+hostPoint.ToString()+" in "
            +timeConsume+"MS :Bytes Received"+nBytes);
            break;
          }
          timeConsume=Environment.TickCount - startTime;
          if(timeout>1000)
          {
            Console.WriteLine("Time Out") ;
            break;
          }
            }
        file://关闭套接字
        socket.Close();
          }
       }
        public class IcmpPacket
        {
           private Byte  _type;            // 报文类型
           private Byte  _subCode;        // 字代码类型
           private UInt16 _checkSum;       // 报文校验和
           private UInt16 _identifier;      // 识别符
           private UInt16 _sequenceNumber;     // 序列号
           private Byte [] _data;         file://数据包
        ///***********************************************************
        ///初始化报文
        ///***********************************************************
        public IcmpPacket(Byte type,Byte subCode,UInt16 checkSum,UInt16 identifi
    er,UInt16 sequenceNumber,int dataSize)
        {
            _type=type;
            _subCode=subCode;
            _checkSum=checkSum;
            _identifier=identifier;
            _sequenceNumber=sequenceNumber;
            _data=new Byte[dataSize];
            for (int i = 0; i < dataSize; i++)
            {
                  _data[i] = (byte)'#';
            }
              }
        public UInt16 CheckSum
        {
            get
            {
                return _checkSum;
            }
            set
            {
                _checkSum=value;
            }
        }
          ///************************************************************
          ///将整个ICMP报文信息和数据转化为Byte数据包
          ///************************************************************
          public int ConvertToByte(Byte[] buffer)
          {
        Byte [] b_type = new Byte[1]{_type};
        Byte [] b_code = new Byte[1]{_subCode};
        Byte [] b_cksum = BitConverter.GetBytes(_checkSum);
        Byte [] b_id = BitConverter.GetBytes(_identifier);
        Byte [] b_seq = BitConverter.GetBytes(_sequenceNumber);
        int i=0;
        Array.Copy( b_type, 0, buffer, i, b_type.Length );
        i+= b_type.Length;
        Array.Copy( b_code, 0, buffer, i, b_code.Length );
        i+= b_code.Length;
        Array.Copy( b_cksum, 0, buffer,i, b_cksum.Length );
        i += b_cksum.Length;
        Array.Copy( b_id, 0, buffer, i, b_id.Length );
        i+= b_id.Length;
        Array.Copy( b_seq, 0, buffer, i, b_seq.Length );
        i += b_seq.Length;
        Array.Copy(_data, 0, buffer, i, _data.Length );
        i += _data.Length;
        return i;
          }
          public static UInt16 SumOfCheck( UInt16[] buffer )
          {
        int cksum = 0;
        for(int i=0;i<buffer.Length;i++)
          cksum += (int) buffer[i];
        cksum = (cksum >> 16) + (cksum & 0xffff);
        cksum += (cksum >> 16);
        return (UInt16)(~cksum);
          }
        }
    }


    --

    A great poem is a fountain forever overflowing with the
     waters of wisdom and delight.
                               
                                              —— Shelley


    ※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.142.118]
    上一篇
    返回上一页
    回到目录
    回到页首
    下一篇


       收藏   分享  
    顶(0)
      




    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/9 2:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/1/14 9:12:02

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    7,425.781ms