C# Ping搜索设备IP地址访问远程计算机 IPAddress

使用Ping命令前需要先获取本机网络配置信息及配置对应IP地址

1、获取本机IP地址

获取本机的IP地址并显示在BoxList控件中

      private void btnGetLocal_Click(object sender, EventArgs e)

        {

            listBox1.Items.Clear();

            IPAddress [] host= Dns.GetHostAddresses(Dns.GetHostName());

            foreach (IPAddress ip in host)

            {

                if(ip.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork)

                listBox1.Items.Add(ip.ToString());

            }

        }

Dns.GetHostName()方法:获取本地计算机的主机名

Dns.GetHostAddresses(string):返回指定主机的Internet协议(IP)地址,返回一个IPAddress类型的数组

2、设置本机IP地址

使用process控件打开CMD程序运行netsh命令修改IP地址

   private void btnSetLocalIP_Click(object sender, EventArgs e)

 {

     process1.StartInfo.FileName = "cmd.exe";

     process1.StartInfo.UseShellExecute = false;

     process1.StartInfo.RedirectStandardInput = true;

     process1.StartInfo.RedirectStandardOutput= true;

     process1.StartInfo.CreateNoWindow = true;

     process1.Start();

     process1.StandardInput.WriteLine($"netsh interface ip set address name=\"以太网\" source=static addr={txtLocalIPAddress.Text}  gwmetric=1&exit");

     process1.StandardInput.AutoFlush = true;

     process1.WaitForExit();//等待程序执行完退出进程

 } 

process.StartInfo:传递给Start()Process方法的属性

(1)FileName:要启动的应用程序或文档。

(2)UseShellExecture:是否使用操作系统Shell启动进程

(3)RedirectStandardInput:应用程序的输入是否从StarnardInput流中读取

(4)RedirectStandardOutput:应用程序的文本输出是否写入StarnardOutput流

(5)CreateNoWindow:是否在新窗口中启动该进程

process.Start():启用Process控件指定的进程

process.StanrardInput:写入应用程序的流,返回值为StreamWriter

(1)WriteLine():将终止符写入文本流

(2)AutoFlush:每次调用之后将其缓冲区刷新到基础流

process.WaitForExit():等待关联进程退出

netsh interface ip set address name="" source=static addr=""  gwmetric=1&exit" 设置网络配置

设置网卡信息后需等待几秒才能生效

3、使用Ping访问远程计算机

使用Ping命令访问远程计算机,如果访问就成功,在RichTextBox控件中显示网络信息,并将IP地址添加到listbox控件中

 void sendPing(Byte[] frame)

 {

     IPAddress ip = new IPAddress(frame);

     Ping pingSender = new Ping();

     PingReply reply = pingSender.Send(ip);

     if (reply.Status == IPStatus.Success)

     {

         string msg = String.Format("【{4}】来自{0}的回复:字节={1} 时间={2} TTL={3} \r\n", reply.Address.ToString(), reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl, DateTime.Now.ToString());

         rtxReceive.AppendText(msg);

         listBox2.Items.Add(reply.Address.ToString());

     }

 }

IP地址可以看作是4个元素的字节数组

IPAddress(Byte []):使用字节数组实例化IPAddress

PingReply的属性

(1)status:访问远程计算机网络状态

(2)address:访问远程计算机的主机地址

(3)buffer:访问远程计算机收到的数据缓冲区

(4)option.TTL:可以转发该数据的路由节点数

4、使用定时器发送Ping命令

IP地址可以看作是16进制数值,将起始地址跟结束地址转换成10进制数值,将起始数值累加后再换成后IP地址形式使用Ping命令

 private void btnSend_Click(object sender, EventArgs e)

 {

     byte[] start = IPAddress.Parse(txtStartIP.Text).GetAddressBytes();

     byte[] end = IPAddress.Parse(txtStopIP.Text).GetAddressBytes();

     startNum = Convert.ToInt64(start[0]) * 256 * 256 * 256 + Convert.ToInt64(start[1]) * 256 * 256 + Convert.ToInt64(start[2]) * 256 + Convert.ToInt64(start[3]);//将16进制IP地址转换为10进制数值

     endNum = Convert.ToInt64(end[0]) * 256 * 256 * 256 + Convert.ToInt64(end[1]) * 256 * 256 + Convert.ToInt64(end[2]) * 256 + Convert.ToInt64(end[3]);

     timer1.Interval =1000;

     timer1.Enabled = true;

     timer1.Start();

 }

IPAddress.Parse(string):IP地址字符串转换为IPAddress实例

IPAddress.GetAddressBytes():网络地址顺序生成字节数组

从起始IP地址的十进制开始发送Ping命令

使用Ping命令前需要将十进制再次转换为16进制IP地址形式发送,发送完毕后起始地址数值递增

当IP地址网段变化时,调用修改IP地址函数修改本机IP地址为同网段,修改完成后等待5s

 private void timer1_Tick(object sender, EventArgs e)

 {

     if (startNum <= endNum)

     {

         byte[] frame = new byte[4];

         frame[0] = Convert.ToByte(startNum/ 16777216);

         frame[1] = Convert.ToByte(startNum % 16777216 / 65536);

         frame[2] = Convert.ToByte(startNum % 65536 / 256);

         frame[3] = Convert.ToByte(startNum % 256);

         string str = String.Format("【{0}】Ping  {1}.{2}.{3}.{4}...... \r\n", DateTime.Now.ToString(), frame[0], frame[1], frame[2], frame[3]);

//将10进制数值转换为16进制IP地址形式

         rtxReceive.AppendText(str);

         sendPing(frame);

         startNum++;

         if (startNum % 256 == 0)

         {

             txtLocalIPAddress.Text = String.Format("{0}.{1}.{2}.199", frame[0], frame[1], frame[2]+1);

             rtxReceive.AppendText("【正在修改本机IP地址......】\r\n");

             btnSetLocalIP_Click(sender, e);

             Thread.Sleep(5000);

             btnGetLocal_Click(sender, e);

         }

     }

 }

完整代码如下

using System;

using System.Windows.Forms;

using System.Net.NetworkInformation;

using System.Net;

using System.Threading;

namespace PingAny

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        Int64 startNum;

        Int64 endNum;

        //开始函数

        private void btnSend_Click(object sender, EventArgs e)

        {

            byte[] start = IPAddress.Parse(txtStartIP.Text).GetAddressBytes();

            byte[] end = IPAddress.Parse(txtStopIP.Text).GetAddressBytes();

            startNum = Convert.ToInt64(start[0]) * 256 * 256 * 256 + Convert.ToInt64(start[1]) * 256 * 256 + Convert.ToInt64(start[2]) * 256 + Convert.ToInt64(start[3]);

            endNum = Convert.ToInt64(end[0]) * 256 * 256 * 256 + Convert.ToInt64(end[1]) * 256 * 256 + Convert.ToInt64(end[2]) * 256 + Convert.ToInt64(end[3]);

            timer1.Interval =1000;

           timer1.Enabled = true;

            timer1.Start();

        }

        //定时器函数

        private void timer1_Tick(object sender, EventArgs e)

        {

            if (startNum <= endNum)

            {

                byte[] frame = new byte[4];

                frame[0] = Convert.ToByte(startNum/ 16777216);

                frame[1] = Convert.ToByte(startNum % 16777216 / 65536);

                frame[2] = Convert.ToByte(startNum % 65536 / 256);

                frame[3] = Convert.ToByte(startNum % 256);

                string str = String.Format("【{0}】Ping  {1}.{2}.{3}.{4}...... \r\n", DateTime.Now.ToString(), frame[0], frame[1], frame[2], frame[3]);

                rtxReceive.AppendText(str);

                sendPing(frame);

                startNum++;

                if (startNum % 256 == 0)

                {

                    txtLocalIPAddress.Text = String.Format("{0}.{1}.{2}.199", frame[0], frame[1], frame[2]+1);

                    rtxReceive.AppendText("【正在修改本机IP地址......】\r\n");

                    btnSetLocalIP_Click(sender, e);

                    Thread.Sleep(5000);

                    btnGetLocal_Click(sender, e);

                }

            }

        }

        //停止

        private void btnStop_Click(object sender, EventArgs e)

        {

            timer1.Stop();

            timer1.Enabled = false;

        }

        //Ping

        void sendPing(Byte[] frame)

        {

            IPAddress ip = new IPAddress(frame);

            Ping pingSender = new Ping();

            PingReply reply = pingSender.Send(ip);

            if (reply.Status == IPStatus.Success)

            {

                string msg = String.Format("【{4}】来自{0}的回复:字节={1} 时间={2} TTL={3} \r\n", reply.Address.ToString(), reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl, DateTime.Now.ToString());

                rtxReceive.AppendText(msg);

                listBox2.Items.Add(reply.Address.ToString());

            }

        }

        //获取本机IP地址

        private void btnGetLocal_Click(object sender, EventArgs e)

        {

            listBox1.Items.Clear();

            IPAddress [] host= Dns.GetHostAddresses(Dns.GetHostName());

            foreach (IPAddress ip in host)

            {

                if(ip.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork)

                listBox1.Items.Add(ip.ToString());

            }

        }

        //修改本机IP地址

        private void btnSetLocalIP_Click(object sender, EventArgs e)

        {

            process1.StartInfo.FileName = "cmd.exe";

            process1.StartInfo.UseShellExecute = false;

            process1.StartInfo.RedirectStandardInput = true;

            process1.StartInfo.RedirectStandardOutput= true;

            process1.StartInfo.CreateNoWindow = true;

            process1.Start();

            process1.StandardInput.WriteLine($"netsh interface ip set address name=\"以太网\" source=static addr={txtLocalIPAddress.Text}  gwmetric=1&exit");

            process1.StandardInput.AutoFlush = true;

            process1.WaitForExit();//等待程序执行完退出进程

        }

    }

}

 

 

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值