网站首页 > 基础教程 正文
客户端关闭后,下次再上课时,需要远程把机房中的电脑全部开机。原理应该就是向指定的mac地址发送一串东西,所以事先要知道对方的MAC地址,这个收集MAC的过程,我是让学生机启动以后就发到教师端来,然后用一个xml来记录。
using System.Net.Sockets;
using System.Net;
using System.Text.RegularExpressions;
namespace kaiji
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread go = null;
private void button1_Click(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
go = new Thread(kaiji);
go.IsBackground = true;
go.Start();
}
void kaiji()
{
//把mac地址放在macstr这里,用*隔开
string[] macs = macstr.Split('*');
int length = macs.Length;
for (int i = 0; i < length; i++)
{
string mac = macs[i];
//如果不是mac地址,继续
if (IsMAC(mac)) { continue; }
//用label显示当前操作对象
label1.Text = "正在向 " + mac + " 发送命令。";
//开机 -----------------------------------------
PowerON(mac, 6588);
}
this.Close();
}
bool IsMAC(string s)
{
Regex r = new Regex(@"^([0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F])#34;);
if (r.IsMatch(s))
{
return true;
}
return false;
}
//开机代码
void PowerON(string mactext, int port)
{
mactext = mactext.Replace("-", ":");
string[] sl = mactext.Split(Convert.ToChar(":"));
byte[] mac = new byte[6];
for (int i = 0; i < 6; i++)
{
mac[i] = ConvertHexToBytes(sl[i]);
}
UdpClient client = new UdpClient();
client.Connect(IPAddress.Broadcast, port);
byte[] packet = new byte[17 * 6];
for (int i = 0; i < 6; i++)
packet[i] = 0xFF;
for (int i = 1; i <= 16; i++)
for (int j = 0; j < 6; j++)
packet[i * 6 + j] = mac[j];
int result = client.Send(packet, packet.Length);
}
byte ConvertHexToBytes(string value)
{
int len = value.Length / 2;
byte[] ret = new byte[len];
for (int i = 0; i < len; i++)
ret[i] = (byte)(Convert.ToInt32(value.Substring(i * 2, 2), 16));
return ret[0];
}
}
}
说明:
//把mac地址放在macstr这里,用*隔开
string[] macs = macstr.Split('*');
这里的macs就是要开机的mac集合
//开机 -----------------------------------------
PowerON(mac, 6588);
注意:因为我的学生机是机房内的机器,所以我们在同一个网段,所以这里我的
UdpClient client = new UdpClient();
client.Connect(IPAddress.Broadcast, port);
是用的IPAddress.Broadcast,如果不在一个网段的话,这样是不行的,广播地址要改成目标IP的广播地址,假如目标IP在30段,
client.Connect(new byte[]{192.168.30.255}, port);
192.168.30.255就是目标机器的IP广播地址了。
- 上一篇: 一起来看看C#的圈复杂度 c# :?
- 下一篇: C#程序员参考手册 高清版 c#程序设计实用教程
猜你喜欢
- 2024-12-26 C#如何获取计算机或硬件信息 c#获取其他程序界面内容
- 2024-12-26 C#中把PDF导出为图片的方法分享 c# 生成 pdf
- 2024-12-26 C# 操作Excel文件之NPOI (一) c#操作excel文件读写
- 2024-12-26 解释C#中的任务并?库(TPL)及其?途
- 2024-12-26 解释 C# 中的任务并?库是如何?作的
- 2024-12-26 NPOI在C#中的用法 c++ npoi
- 2024-12-26 C#程序员参考手册 高清版 c#程序设计实用教程
- 2024-12-26 一起来看看C#的圈复杂度 c# :?
- 2024-12-26 TCP网络编程中connect()、listen()和accept()三者之间的关系
- 2024-12-26 C#零基础入门运动控制卡学习实验教程1——运动控制高速低速实验
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)