使用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();//等待程序执行完退出进程
}
}
}