zoukankan      html  css  js  c++  java
  • C语言实现wake on lan(网络唤醒)

            wake on lan是一种网络唤醒功能,它可以实现远程开机,刚好实验室有一台ftp服务器,因为不是24小时开机的,所以每次开机都要跑过去用手按开关,非常麻烦,于是在网上找了下资料,自己实现了一把,并在windows下用Qt写了个简单的界面,以后想开服务器就方便了。原理就是源主机广播一个特殊的数据包给目的主机,前提是目的主机的主板支持wake on lan并在BIOS里已经设置好,还有就是要知道目的主机的MAC地址。这个特殊的数据包叫做magic packet,它由102个字节组成,最前面六个字节为0xFF,其他字节为目的主机的MAC地址(6个字节为一组,共16组),如下图所示:

           知道这个原理之后就可以很容易实现了,实现代码如下,本人亲测。

     1 #include <stdio.h>
     2 #include <arpa/inet.h>
     3 #include <sys/ioctl.h>
     4 #include <net/if.h>
     5 #include <string.h>
     6 #include <unistd.h>
     7 #include <stdlib.h>
     8 
     9 
    10 int main(int argc, char* argv[])
    11 {
    12         unsigned char mac[6]={0x00,0x10,0x20,0x30,0x40,0x50};//目的主机MAC地址,例如: 00:10:20:30:40:50
    13         unsigned char packet[102];
    14         struct sockaddr_in addr;
    15         int sockfd, i,j, on = 1;
    16 
    17         //构建magic packet
    18         for(i=0;i<6;i++)            
    19             packet[i] = 0xFF;    
    20             
    21         for(i=1;i<17;i++)
    22             for(j=0;j<6;j++)
    23                 packet[i*6+j] = mac[j];
    24         
    25         //UDP
    26         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    27         //广播
    28         setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&on, sizeof(on));
    29         if(sockfd < 0)
    30             exit(0);
    31                 
    32         memset((void*)&addr, 0, sizeof(addr));
    33         addr.sin_family = AF_INET;
    34         addr.sin_port = htons(10000);
    35         addr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");//广播地址
    36         
    37         sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr));
    38         close(sockfd);
    39             
    40         return 0;
    41 }

    实际中需要根据目的主机来修改MAC地址和广播地址。

  • 相关阅读:
    pyspark读取parquet数据
    python求时间差
    pandas索引操作之loc,iloc,ix等方法
    pandas的concat和drop函数
    mysql语句的书写顺序和执行顺序
    hive的lower,upper,length,concat,lpad,rpad,cast,split函数简述
    hive的floor函数,ceil函数,round函数
    Pandas建立空的dataframe和cumsum累加函数
    Python基础笔记二之求序列均值、标准差、中位数、分位数
    NAT实验
  • 原文地址:https://www.cnblogs.com/lknlfy/p/2857796.html
Copyright © 2011-2022 走看看