1
private
static
void
WakeUp(
byte
[] mac) {
2 UdpClient client = new UdpClient();
3 client.Connect(IPAddress.Broadcast, 30000 );
4
5 byte [] packet = new byte [ 17 * 6 ];
6
7 for ( int i = 0 ; i < 6 ; i ++ )
8 packet[i] = 0xFF ;
9
10 for ( int i = 1 ; i <= 16 ; i ++ )
11 for ( int j = 0 ; j < 6 ; j ++ )
12 packet[i * 6 + j] = mac[j];
13
14 int result = client.Send(packet, packet.Length);
15 }
2 UdpClient client = new UdpClient();
3 client.Connect(IPAddress.Broadcast, 30000 );
4
5 byte [] packet = new byte [ 17 * 6 ];
6
7 for ( int i = 0 ; i < 6 ; i ++ )
8 packet[i] = 0xFF ;
9
10 for ( int i = 1 ; i <= 16 ; i ++ )
11 for ( int j = 0 ; j < 6 ; j ++ )
12 packet[i * 6 + j] = mac[j];
13
14 int result = client.Send(packet, packet.Length);
15 }
PS:跨路由器的问题(不是公网IP问题)。如果机器A和机器B处于同一个网段内,用client.Connect(IPAddress.Broadcast,port)是可以的,如果A和B不是处于同一个网段内,那么就要用网段内的广播地址,比如A机器是192.168.1.2,B机器IP地址是192.168.100.3,用A远程唤醒B,就要用B网段的广播地址,192.168.100.255。
IPAddress ip = new IPAddress(new byte[]{192,168,100,255});
client.Connect(ip,port)。原理可以参考网络协议。
其它详细信息,请看AMD的白皮书Magic Packet Technology
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/20213.pdf