// 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. 希尔排序——Java实现

    一.排序思想 希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: 随着步长逐渐减小,所 ...

  2. 元类(metaclass)

    一.储备知识exec 储备知识exec:有下面三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定默认使用globals() 参数三:局部作用域(字典形式),如果不指定默认就 ...

  3. SQL Server 2008 R2如何开启数据库的远程连接(转)

    SQL Server 2008默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,远程连接数据库.需要做两个部分的配置: SQL Server Manag ...

  4. angular怎么样注销事件

    angular怎么样注销事件 $scope.$on("$destroy", function() { //清除配置,不然scroll会重复请求 }) 在Controller中监听$ ...

  5. ubuntu GITLAB完全导入SVN(提交历史,用户)项目

    从SVN导入到GITLAB目前没有直接的方案,通常需要通过GIT转换:SVN –>GIT –>GITLAB.通过这种方式,将SVN的提交历史,用户信息一并导入到gitlab 注:本文只适用 ...

  6. adnroid 自定义ProgressDialog加载中

    用来记录自己所用到的知识 前两天在做项目的时候发现有时候在访问网络数据的时候由于后台要做的工作较多,给我们返回数据的时间较长,所以老大叫我加了一个加载中的logo图用来提高用户体验. 于是就在网上找了 ...

  7. scope 作用域(bean 的生存范围)

    默认是 singleton ,单例模式,如下代码: @Test public void testAddUser() throws Exception { ApplicationContext ctx ...

  8. IIS环境搭建

    IIS环境搭建 IIS环境搭建首先是建立在一个干净的.无毒的系统上,再进行相应操作.本文用到的是windows 2003的镜像文件,有条件的用户也可以使用windows的系统安装光盘. 下面进入操作步 ...

  9. 学习和运用scrum

    作为长大的大三老腊肉,我们已经在长大生活了两年多,对于什么是长大人最想完善的校园需求.最想拥有的校园服务媒介也有了更加深切的体会. 于是,GoodJob小团队blingbling闪现啦!! GoodJ ...

  10. OC 构造方法

    #import <Foundation/Foundation.h> @interface Student : NSObject { int _age; int _no; } - (void ...