13397158231   jevian_ma@worldflying.cn

wakeup on lan所需的魔术数据包格式以及代码

2021-12-01 23:23:14

知道最近小沃在干嘛吗?小沃最近在研究服务器如何通过网卡启动。以后小沃可以自己开发开机棒了,呵呵。回归正题,开机的魔术数据包标准格式是前面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;
}


文章作者:沃航科技


优秀产品推荐:可编程网络IO控制器

上一篇:C语言自动格式化工具clang-format使用以及添加到vscode的方法

下一篇:Jave Log4j漏洞肆虐,沃航科技不受影响

联系我们

  • 地址:武汉市东湖高新开发区光谷总部国际1栋2412室
  • QQ:932773931
  • 电话:027-59761089-806
  • 手机:13397158231
  • 邮箱:jevian_ma@worldflying.cn

关注公众号

扫码添加微信

沃航(武汉)科技有限公司版权所有

备案号:鄂ICP备16014230号-1

本网站由提供CDN加速/云存储服务