知道最近小沃在干嘛吗?小沃最近在研究服务器如何通过网卡启动。以后小沃可以自己开发开机棒了,呵呵。回归正题,开机的魔术数据包标准格式是前面6个0xff,然后再联系发送16个mac地址,一共106个字节,通过udp协议广播形式(255这个地址)发送出去,当网卡收到后就能实现该功能了。
关于bios的设置以及操作系统的设置,请大家自己去查。话不多说,直接上代码:
#include <stdio.h> #include <winsock2.h> // 编译命令gcc -o PowerOnServer WakeUpOnLan.c -lws2_32 char *broadcastip = "192.168.1.255"; // 广播ip地址 unsigned char mac[6] = { 0x5d, 0xb9, 0x01, 0x89, 0xb0, 0x6f }; // 需要开机的设备网卡mac地址 unsigned char sendData[102] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; int main (void) { WORD sockVision; WSADATA wsadata; SOCKET sclient; struct sockaddr_in sin; int i, j, offset = 6; sockVision = MAKEWORD(2,2); if(WSAStartup(sockVision,&wsadata) != 0) { printf("WSAStartup error\n"); return -1; } sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(sclient == INVALID_SOCKET) { printf("create socket fail\n"); return -2; } sin.sin_family = AF_INET; sin.sin_port = htons(21); sin.sin_addr.S_un.S_addr = inet_addr(broadcastip); for (i = 0 ; i < 16 ; i++) { for (j = 0 ; j < 6 ; j++) { sendData[offset++] = mac[j]; } } sendto(sclient, sendData, sizeof(sendData), 0, (struct sockaddr*)&sin, sizeof(sin)); closesocket(sclient); WSACleanup(); printf("发送启动命令成功。"); getchar(); return 0; }
文章作者:沃航科技