ios 实现局域网远程开机的代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios 实现局域网远程开机的代码相关的知识,希望对你有一定的参考价值。
在网上翻来翻去,找到了部分c语言写的代码,所以采用oc,c混编
在头文件里导入需要的C.库
#include <stdio.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <net/if.h> #include <string.h> #include <unistd.h> #include <stdlib.h>
mac地址:
NSString*[email protected]"36:b2:47:f4:f4:d3";
将mac地址转换为char数组:
/*--去除字符串中的 :---*/ NSArray *macArr = [macStr componentsSeparatedByString:@":"]; NSMutableArray*arr=[macArr mutableCopy]; //修改一下格式 for (int i=0; i<arr.count; i++) { NSString*string22=[NSString stringWithFormat:@"0x%@",arr[i]]; arr[i]=string22; } //目的主机mac地址 unsigned char mac[6]; //转成char字符型 for(int i=0;i<arr.count;++i){ const char *ptr2 = [arr[i] cStringUsingEncoding:NSASCIIStringEncoding]; int ptr3; sscanf(ptr2, "%x",&ptr3); mac[i]=ptr3; }
广播域:
NSString*[email protected]"255.255.255.255"; const char *ptr = [string cStringUsingEncoding:NSASCIIStringEncoding];
构建魔术包:
unsigned char packet[102]; struct sockaddr_in addr; int sockfd, i,j, on = 1; for(i=0;i<6;i++){ packet[i] = 0xFF; } for(i=1;i<17;i++){ for(j=0;j<6;j++){ packet[i*6+j] = mac[j]; } }
发送:
//UDP sockfd = socket(AF_INET, SOCK_DGRAM, 0); //广播 setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&on, sizeof(on)); if(sockfd < 0){ exit(0); } memset((void*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(10000); addr.sin_addr.s_addr = inet_addr(ptr);//广播地址 sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&addr, sizeof(addr)); close(sockfd);
以上是关于ios 实现局域网远程开机的代码的主要内容,如果未能解决你的问题,请参考以下文章
树莓派实现远程开机局域网电脑(WOL协议+etherwake+华硕主板Z97)
QT使用WOL实现远程一键开机(局域网,需要目标电脑的主板支持,并且插上网线,用udpSocket.writeDatagram一句话就可以)