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一句话就可以)

利用vscode + sftp插件 实现远程同步代码

wake up on lan 安卓手机控制局域网唤醒开机+远程关机

IOS开发-OC学习-常用功能代码片段整理