朋友做出来的远程开机项目在寝室试验成功,就是不知道是什么原理,请高手分析来自:http://bbs.ccsdn.com/read.php?tid=268using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;namespace LanStartUp
{
public partial class frmTelnet : Form
{
public frmTelnet()
{
InitializeComponent();
} [DllImport("ws2_32.dll")]
private static extern int inet_addr(string cp);
[DllImport("IPHLPAPI.dll")]
private static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 pMacAddr, ref Int32 PhyAddrLen); //开机
private void button1_Click(object sender, EventArgs e)
{
string s = this.textBox1.Text;
string[] sl = s.Split(Convert.ToChar("-"));
byte[] mac = new byte[6];
for (int i = 0; i < 6; i++)
{
mac[i] = ConvertHexToBytes(sl[i]);
} // 发一个BroadCast包,包的内容包括以下数据就可以了。
// FF FF FF FF FF FF,6个FF是数据的开始,
// 紧跟着16次MAC地址就可以了。
UdpClient client = new UdpClient();
client.Connect(IPAddress.Broadcast, 30000);
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); }
//将HEX转化为BYTES
public static 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];
} //根据IP获取MAC地址
private void button2_Click(object sender, EventArgs e)
{
if (textBox2.Text == "")
{
MessageBox.Show("请输入正确的IP!");
}
else
{
textBox1.Text = GetMacAddress(textBox2.Text);
}
} //获取远程IP(不能跨网段)的MAC地址
private string GetMacAddress(string hostip)
{
string Mac = "";
try
{
Int32 ldest = inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型
Int64 macinfo = new Int64();
Int32 len = 6;
//根据IP获取MAC
SendARP(ldest, 0, ref macinfo, ref len);
string TmpMac = Convert.ToString(macinfo, 16);//转换成16进制
Mac = TmpMac.Substring(0, 2).ToUpper();
for (int i = 2; i < TmpMac.Length; i = i + 2)
{
Mac = TmpMac.Substring(i, 2).ToUpper() + "-" + Mac;
}
}
catch
{
MessageBox.Show("获取远程主机的MAC错误:请输入正确的IP!");
}
return Mac;
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;namespace LanStartUp
{
public partial class frmTelnet : Form
{
public frmTelnet()
{
InitializeComponent();
} [DllImport("ws2_32.dll")]
private static extern int inet_addr(string cp);
[DllImport("IPHLPAPI.dll")]
private static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 pMacAddr, ref Int32 PhyAddrLen); //开机
private void button1_Click(object sender, EventArgs e)
{
string s = this.textBox1.Text;
string[] sl = s.Split(Convert.ToChar("-"));
byte[] mac = new byte[6];
for (int i = 0; i < 6; i++)
{
mac[i] = ConvertHexToBytes(sl[i]);
} // 发一个BroadCast包,包的内容包括以下数据就可以了。
// FF FF FF FF FF FF,6个FF是数据的开始,
// 紧跟着16次MAC地址就可以了。
UdpClient client = new UdpClient();
client.Connect(IPAddress.Broadcast, 30000);
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); }
//将HEX转化为BYTES
public static 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];
} //根据IP获取MAC地址
private void button2_Click(object sender, EventArgs e)
{
if (textBox2.Text == "")
{
MessageBox.Show("请输入正确的IP!");
}
else
{
textBox1.Text = GetMacAddress(textBox2.Text);
}
} //获取远程IP(不能跨网段)的MAC地址
private string GetMacAddress(string hostip)
{
string Mac = "";
try
{
Int32 ldest = inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型
Int64 macinfo = new Int64();
Int32 len = 6;
//根据IP获取MAC
SendARP(ldest, 0, ref macinfo, ref len);
string TmpMac = Convert.ToString(macinfo, 16);//转换成16进制
Mac = TmpMac.Substring(0, 2).ToUpper();
for (int i = 2; i < TmpMac.Length; i = i + 2)
{
Mac = TmpMac.Substring(i, 2).ToUpper() + "-" + Mac;
}
}
catch
{
MessageBox.Show("获取远程主机的MAC错误:请输入正确的IP!");
}
return Mac;
}
}
}
解决方案 »
- 保存附件代码没有报错,但导出的文件里面只有System.Byte[]内容
- System.Configuration.ConfigurationSettings.AppSettings 取值问题
- 请教System.Web如何处理script的跳转
- 这里有一段不长的代码,哪位大侠给我看一下?很急!!!
- 求数据库访问类的设计思路
- 关于C语言中构造函数,在C#语句中如何改写?在线等
- 求简体中文转繁体日文的类
- 升级了,散分200
- C#中无法使用crystal report control控件
- 有C#中如何实现记录集的移动?
- 谁能看看这个是怎么实现的???
- C# 窗体 数据库备份和还原!!!请各位大侠急救!!!
http://bbs.ccsdn.com
http://baike.baidu.com/view/1965454.htm