// 2C:4D:54:ED:08:F0
#include <stdio.h>
#include <Windows.h>
#include <winsock.h> #pragma comment(lib,"Ws2_32.lib") /*
从文件通过ip获取mac
ip:欲取ip的mac地址
成功返回对应mac,否则返回NULL.
*/
unsigned char *GetfileMacforIp(char *ip);
/*
远程唤醒
mac:目标mac地址
ps:在此之前要确保目标主板支持远程唤醒
*/
VOID RemoteStart(unsigned char *mac); int main(void)
{
unsigned char *mac = GetfileMacforIp("172.18.1.6");
if (mac)
{
printf("%X-%X-%X-%X-%X-%X\n", mac[], mac[], mac[], mac[], mac[], mac[]);
//free(mac); 为什么无法free?
}
system("pause");
return ;
} VOID RemoteStart(unsigned char *mac)
{
// 存封包数据,格式为:6个0xFF为一组,16个mac地址为一组.mac地址正好是6个字节,封包总大小=6+16*6=102
unsigned char packet[] = { };
struct sockaddr_in addr;
int sockfd, i, j;
const char on = ;
WSADATA aaa; // 填充封包数据
for (i = ; i < ; i++)
packet[i] = 0xFF;
for (i = ; i < ; i++)
{
for (j = ; j < ; j++)
{
packet[i * + j] = mac[j];
}
}
// 使用socket发送封包前必须初始化socket
WSAStartup(MAKEWORD(, ), &aaa);
// udp方式
sockfd = socket(AF_INET, SOCK_DGRAM, );
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
if (sockfd < )
{
printf("setsockopt filed!\n");
return;
}
memset(&addr, , sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons();
// 广播地址:255.255.255.255
addr.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
sendto(sockfd, (const char *)packet, sizeof(packet), , (struct sockaddr *)&addr, sizeof(addr));
WSACleanup();
} unsigned char *GetfileMacforIp(char *ip)
{
char tmp[] = { };
char *pos = NULL;
char mac[] = { };
unsigned char *mac1 = (unsigned char*)malloc(sizeof(unsigned char)*);
//unsigned char mac1[6] = { 0 }; FILE *wj = NULL;
fopen_s(&wj, "ipmac.txt", "r");
if (!wj)
{
printf("file can`t open!\n");
return ;
}
while (!feof(wj))
{
memset(tmp, , );
fgets(tmp, , wj);
pos = strstr(tmp, ip);
if (pos)
{
// 文本形式Mac地址
memmove(mac, tmp + strlen(ip) + , );
// 转字节形式Mac地址
sscanf_s(mac, "%x-%x-%x-%x-%x-%x", &mac1[], &mac1[], &mac1[], &mac1[], &mac1[], &mac1[]);
//printf("%X %X %X %X %X %X\n",mac1[0],mac1[1],mac1[2],mac1[3],mac1[4],mac1[5]);
break;
}
}
fclose(wj);
return mac1;
}

核心函数是RemoteStart,GetfileMacforIp是我在本地存放的一个ip和mac地址的数据文件。

C/C++远程开机的更多相关文章

  1. C#实现局域网内远程开机

    1.远程开机原理 远程开机Wake on LAN(WOL),俗称远程唤醒,远程唤醒的实现主要是向目标主机发送特殊格式的数据包,是AMD公司制作的MagicPacket这套软件以生成网络唤醒所需要的特殊 ...

  2. Python 远程开机

    用 Python 关机你肯定听过或者实践过,那么用 Python 开机呢?这是一个神奇的方法,教你如何用 Python 来开机. 本文目标 远程开机原理 Python 远程开机代码实现 Python ...

  3. java代码实现网络远程开机

    http://my.oschina.net/kingfire/blog/156764 概述 远程开机(Wake onLAN)是指通过网络实现对服务器或者pc启动运行,现在很多网卡都支持的这个功能. 其 ...

  4. C#实现远程开机(局域网测试通过)

    首先介绍相关知识. UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联 ...

  5. java实现远程开机

    import java.io.IOException; import java.net.*;public class 远程开机 { public static void main(String[] a ...

  6. linux远程开机

    它需要wakeonlan这个软件,     从何处得到它?     它的官方站是:http://sourceforge.net/projects/wake-on-lan/     如果使用rpm包可以 ...

  7. linux 通过wol远程开机【转】

    转自:http://yangbajing.blog.chinaunix.net/uid-10480699-id-5179860.html 今天发现个可以对linux服务器进行远程开机的软件-wakeo ...

  8. FRP+WoL实现远程开机+远程桌面

    FRP+WoL实现远程开机+远程桌面 故事背景 这是一个很复杂而且很久远的故事,如果要讲的话,这个故事可以追溯到1981年(「都是废话,没有干货,如果不感兴趣请从第二章开始」),简单来说: 1981年 ...

  9. ubuntu 远程开机

    启动者(电脑A)  ----------->  被远程开启的电脑(电脑B) 一.被远程开启的电脑(电脑B):1. 重新开机,并进到BIOS设定2. 把Wake On Land / Wake On ...

  10. Ubuntu远程开机 (Wake on Lan)

    启动者(A) 被远程开启者(B) 一.被远程开启的电脑(电脑B):1. 重新开机,并进到BIOS设定2. 把Wake On Land / Wake On PCI(E)设为Enable3. 储存并进入U ...

随机推荐

  1. hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)

    hibernate的保存hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:一.预备知识:在所有之前,说明一下,对于hibernate,它的对象有三种状态,t ...

  2. C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  3. Java程序员应该知道的linux命令

    1.查看Java进程:ps -ef|grep java,ps auxf|grep jva; 2.杀死所有Java进程: pkill java, kill -9 进程ID: 3.进入目录:cd /usr ...

  4. scss-数据类型

    scss当前支持七种主要数据类型 (1).数字,1, 2, 13, 10px. (2).字符串,有引号字符串与无引号字符串,"foo", 'bar', baz. (3).颜色,bl ...

  5. HTML 5 表单相关元素和属性

    HTML使用表单向服务器提交请求,表单.表单控件的主要作用是收集用户输入,当用户提交表单时,用户输入内容将被作为请求参数提交到远程服务器.因此,在Web编程中,表单主要是用于收集用户输入的数据,在需要 ...

  6. HBase伪分布式安装(HDFS)+ZooKeeper安装+HBase数据操作+HBase架构体系

    HBase1.2.2伪分布式安装(HDFS)+ZooKeeper-3.4.8安装配置+HBase表和数据操作+HBase的架构体系+单例安装,记录了在Ubuntu下对HBase1.2.2的实践操作,H ...

  7. arcgis版接合图表5.2 免费软件,支持国家2000坐标系,ArcGIS10.0,ArcGIS10.1,ArcGIS10.2都可以使用

    下载地址:http://files.cnblogs.com/gisoracle/jionmap52.rar 1.      国家2000,西安80,北京54.坐标系的接合图表生成.根据经纬度范围,坐标 ...

  8. show_sql和format_sql

    <property name="show_sql">true</property> <property name="hibernate.fo ...

  9. Android学习——SharedPreferences

    接下来的几个博文,来介绍安卓中的数据存储方式,安卓中的数据存储主要有四种方式: 1.SharedPreferences 2.SQLite 3.Content Provider 4.File 这篇博文主 ...

  10. asyncio标准库5 TCP echo client and server

    server import asyncio async def handle_echo(reader, writer): data = await reader.read(100) message = ...