利用C语言实现wol网络远程唤醒

  • 技术原理
  • 技术原理
  • c语言代码实现
  • 可能失败的原因

技术原理

Wake-On-LAN简称WOL,是一种电源管理功能;如果存在网络活动,则允许设备将操作系统从待机或休眠模式中唤醒。许多主板厂商支持IBM提出的网络唤醒标准。该标准允许网络管理员远程打开PC机电源,以便进行文件升级、资源跟踪和设备清点等工作。WOL在还未广泛的采用,但在网络时代却具有广阔的发展前景。
Wake-On-LAN的实现,主要是向目标主机发送特殊格式的数据包,是AMD公司制作的MagicPacket这套软件以生成网络唤醒所需要的特殊数据包,俗称魔术包(Magic Packet)。MagicPacket格式虽然只是AMD公司开发推广的技术,并非世界公认的标准,但是仍然受到很多网卡制造商的支持,因此许多具有网络唤醒功能的网卡都能与之兼容。

技术原理

利用终端WOL(Wake On Lan)功能,即局域网唤醒功能实现。按照WOL协议规定,在电脑处于关机而网卡供电状态下,从网络上接收到WOL魔数包后会自动加电开机,这种方式能够很方便应用在需要进行远程管理的环境中。该功能需要硬件(主要是主板和网卡)支持,且需要是开启状态才能使用。基本实现原理实现如下:
假设需要被唤醒的终端网卡MAC地址为:01:02:03:04:05:06, 则WOL魔法包结构为:
6对“FF”前缀+16次重复MAC地址组成

 FF FF FF FF FF FF + 01 02 03 04 05 06(重复16次)

数据包总长度为102 字节,通过把数据包发送到本地子网广播地址的UDP端口9即可唤醒该终端。

c语言代码实现

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>int wol(const char *mac)
{if (mac == NULL || strlen(mac) == 0) { //如果mac地址为空,返回错误printf("wol failed, because mac is null");return -1;}if (strlen(mac) != 17) { //如果mac地址不是正常的地址,返回错误printf("wol failed, because mac is %s\n",mac);return -1;}int ret = -1;int send_length = -1;unsigned char packet[102] = {0};struct sockaddr_in addr;int sockfd, i,j, option_value = 1;unsigned char mactohex[6] = {0};sscanf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", &mactohex[0], &mactohex[1], &mactohex[2], &mactohex[3], &mactohex[4], &mactohex[5]);printf("Mac is %s,mac to hex is %02x%02x%02x%02x%02x%02x\n",mac,mactohex[0],mactohex[1],mactohex[2],mactohex[3],mactohex[4],mactohex[5]);//构建magic packetfor(i=0;i<6;i++) { //6对“FF”前缀packet[i] = 0xFF;}for(i=1;i<17;i++) { //目标计算机的MAC地址,重复16次for(j=0;j<6;j++) {packet[i*6+j] = mactohex[j];}}//UDPsockfd = socket(AF_INET, SOCK_DGRAM, 0);//广播ret = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &option_value, sizeof(option_value));if (ret < 0) {printf("set socket opt failed, errno=%d\n", errno);close(sockfd);return ret;}memset((void*)&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(9);addr.sin_addr.s_addr = inet_addr("255.255.255.255");//UDP广播地址//发送广播send_length = sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr));if(send_length < 0) {printf("wol send data ret <= 0, ret = %d, errno = %d", send_length, errno);}close(sockfd);return ret;
}int main (int argc, char* args[])
{if (argc > 1){wol(args[1]);}return 0;
}

可能失败的原因

1,需要使用有线网卡,无线网卡不支持远程唤醒。
2,系统层面。Win7 没有官方支持 WOL,但是依托于网卡的 WOL,可以成功唤醒。Win8 及以上的系统的快速启动将计算机置于 S4 状态中(正常关机是 S5),而 WOL 仅在 S5 提供支持,所以需要关闭“快速启动”。
3,硬件层面,如果使用windows得正常关闭计算机,网卡仍保持着连接。如果这时候直接长按关机键硬件断开电源再恢复供电,则网卡不会重新建立连接,也就不能远程唤醒。所以请保持住关机状态下的供电。

远程唤醒的逻辑是要软件去配置网卡,让网卡进入远程唤醒模式。
长按电源键关机后,不支持唤醒;是什么原因? --长按电源键是硬件强制断电,软件来不及配置网卡,所以无法远程唤醒。
直接拔电源,再插上电源,支持唤醒 --直接把电源后上电,上电过程中网卡首次上电,会导入默认值,默认就进入远程唤醒模式。
正常终端软关机,支持唤醒 。 --软关机,关机的时候软件会配置网卡进入远程唤醒模式,所以可以远程唤醒。
无线网卡,不支持唤醒。 --无线网卡目前没去实现远程唤醒。

参考来源
[1] 总结几点 Wake On Lan (WOL) 失败的原因:https://blog.csdn.net/hanziyuan08/article/details/97325883

利用C语言实现wol网络远程唤醒相关推荐

  1. Wol 网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑

    文章目录 Wol 网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑 1.远程唤醒简介 2.需要以下唤醒条件 3.环境和准备工作 4.配置路由器,让路由器接收你的远程开机命令 5.测试配置的网 ...

  2. 利用C语言编写一个网络分析器

    一.链路层数据格式 mac报文:14个字节 二.IP数据报文格式 三.TCP数据报文格式 四.UDP数据报文格式 五.demo(网络分析器) recvfrom接收链路层帧数据,不经过网络层.传输层,不 ...

  3. 基于esp32/8266利用c语言、micropython、lua、编写的寝室网络门禁系统

    前言 本章所有代码均已上传至github https://github.com/Adancurusul/Bedroom_iot/tree/master/door/mqtt 感觉学习网络模块已经有一段时 ...

  4. 唤醒幻数据包禁用会怎么样_如何利用splashtop实现远程开机、远程唤醒电脑

    Splashtop商业版和个人版提供了局域网唤醒计算机(WoL)功能,您可以按照下面的指引进行设置. 首先,请确保完全满足以下三个条件,否则,远程唤醒无法工作. 计算机 BIOS支持WoL并且该选项已 ...

  5. 利用R语言对泰坦尼克号沉没事件幸存者的数据分析与预测

    题外话:在文章正式开始之前,我还是想先写一点题外话,一是为了引出写作这篇博客的目的,二则是希望能够记录下现在的所思所想为以后留个纪念.首先介绍一下自己,毕业3年多的小硕一枚,大学期间学的专业是高分子材 ...

  6. php开发的app商城,如何利用PHP语言开发手机APP

    如何利用PHP语言开发手机APP 一般的PHP框架都可以用来做app后台服务器.因为原理上客户端从你这边拿的都是字符串数据,所以就算你不用框架也没有问题,不过会引发后续的问题.PHP提供API给客户端 ...

  7. Cloud Computing:基于无影云电脑利用Python语言实现绘制“可爱小老虎”虎年快乐及无影云电脑简介、应用场景、使用体验(五步快速上手)分享图文教程之详细攻略

    Cloud Computing:基于无影云电脑利用Python语言实现绘制"可爱小老虎"虎年快乐及无影云电脑简介.应用场景.使用体验(五步快速上手)分享图文教程之详细攻略 目录 无 ...

  8. 利用JAVA语言实现支持视频点播的WEB服务器

    一.项目简介: JAVA语言是一种可移植的,简单的,健壮的嵌入式语言.并且对网络,数据库有很好的支持,基于JAVA语言的这种特性可以十分容易地建立一个小型INTERNET服务器. 本项目中,作者用JA ...

  9. linux sniffer 程序使用教程,在Linux下利用C语言来实现一个Sniffer的方法简介

    Sniffer技术是网络安全领域里一项非常重要的技术!对于"Hacker"来说,他们可以以非常隐蔽的方式得到网络中传输的大量的敏感信息,如 Telnet,ftp帐号和密码等等明文传 ...

  10. Java语言进阶:网络编程入门

    Java语言进阶:网络编程 网络编程入门 C/S C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. 特点: 客户端和服务器是分开的,需要下载客户 ...

最新文章

  1. 售前比售后机器人控制逻辑更复杂,仅凭大规模数据后发优势难赶超!
  2. Knowledge Graph |(1)图数据库Neo4j简介与入门
  3. IT人怎能忘记这些开源?
  4. zabbix监控java线程池,linux线程数限制与zabbix监控
  5. linux中可以安装不同版本的gcc么,在linux下安装多个版本的GCC
  6. vs2013和vs2010的配置
  7. 京东商品及评论爬虫(selenium)
  8. Python之数据分析(random模块的正确用法)
  9. 用python语言计算矩阵_Python语言实现矩阵计算
  10. 实战PHP数据结构基础之队列
  11. Webx MVC分析
  12. Flutter之_slot 插槽属性详解
  13. 用Adobe Flex3开发AIR应用程序–入门指南
  14. selenium+python自动化106 - 滑动 iframe 上的滚动条
  15. C# 高并发场景下 共享内存 Actor并发模型到底哪个快?
  16. 计算机视觉论文-2021-07-14
  17. 基于C#+Mysql实现(WinForm)企业的设备管理系统【100010018】
  18. 北京信息科技大学计算机研究生在哪个校区,北京信息科技大学有几个校区,哪个校区最好及各校区介绍...
  19. 吹爆的一种深度拷贝方式
  20. .NET Framework的作用是什么

热门文章

  1. 【磨刀不误砍柴工】(SCH-1217) Could not open “XXschematic“ for edit. Would you like to open it for read?问题。
  2. 【雅思】【绿宝书错词本】List13~24
  3. 【成功】qlv转MP4,超简单方法
  4. 对数似然比LLR公式的问题
  5. 用以太坊区块链和jwt token保证Asp.Net Core的API交互安全(上)
  6. 计算机网络期末实验考试题目+总结(用的是CISCO软件~~)
  7. 【CodeForces】[372A]Counting Kangaroos is Fun
  8. Python 一个好用到爆炸的IP端口扫描工具类
  9. Spring In Action 学习 第一章 Spring之旅
  10. SlideShow Pro(幻灯片制作)v5.0.0.10绿色中文版