android firmware 利用UDP socket发送Magic Packet--c语言版本

本文介绍了一段用于Android固件中通过UDP socket发送MagicPacket的C语言代码实现。MagicPacket格式为6个0xFF加上16次重复的目的MAC地址。代码详细展示了如何设置目的MAC地址、IP地址及端口,并利用socket进行数据包发送。

android firmware 利用UDP socket发送Magic Packet

1 Magic Packet格式:

  6个0xFF + 16个Dst Mac Address

2 代码需要设置目的MAC地址, 目的IP地址和使用的端口

 

 1 #include <stdio.h> 
 2 #include <string.h> 
 3 #include <stdlib.h> 
 4 #include <unistd.h> 
 5 #include <sys/types.h> 
 6 #include <sys/stat.h> 
 7 #include <sys/socket.h> 
 8 #include <netinet/in.h> 
 9 #include <arpa/inet.h> 
10 #include <netdb.h> 
11 
12 void generate_magic_packet(void *magic_buf, void *mac) 
13 { 
14          int i; 
15          char *ptr; 
16 
17          ptr = magic_buf; 
18          memset(ptr, 0xFF, 6); 
19          ptr += 6; 
20 
21          for(i = 0; i < 16; ++i) { 
22                  memcpy(ptr, mac, 6); 
23                  ptr += 6; 
24          } 
25 } 
26 
27 int main(int argc, char **argv) 
28 { 
29          int s; 
30          int packet_num = 10; 
31          char c; 
32 
33          unsigned char mac[6] = {0x94, 0x39, 0xE5, 0x02, 0x5E, 0xC9}; 
34          char dstip[256] = "192.168.1.106"; 
35          int port = 1900; 
36 
37          struct sockaddr_in address; 
38          char magic_buf[6 + 6 * 16] = {0}; 
39 
40          daemon(0,0);    /* run in background */ 
41 
42          s = socket(AF_INET, SOCK_DGRAM, 0); 
43          if (s == -1) { 
44                  perror("Opening socket"); 
45                  exit(EXIT_FAILURE); 
46          } 
47 
48          memset(&address, 0, sizeof(struct sockaddr_in)); 
49          address.sin_family = AF_INET; 
50          address.sin_addr.s_addr = inet_addr(dstip); 
51          address.sin_port = htons(port); 
52 
53          generate_magic_packet(magic_buf, mac); 
54 
55          /* ten packets. TODO: use ping to check whether the destination is on or else. */ 
56          while (packet_num-- > 0) { 
57                  if (sendto(s, magic_buf, sizeof(magic_buf), 0, 
58                       (struct sockaddr *)&address, sizeof(address)) < 0) { 
59                          printf("sendto\n"); 
60                          exit(EXIT_FAILURE); 
61                  } 
62                  sleep(1); 
63          } 
64 
65          exit(EXIT_SUCCESS); 
66 } 

 

posted on 2016-06-23 17:33 xuhaohunter 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/xuhaohunter/p/5611593.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值