作者:打完BOSS好睡觉1998 | 来源:互联网 | 2023-08-13 15:38
如果,你的电脑和树莓派连在了同一个局域网中。如何从它的MAC地址知道它的IP呢?教程目标:写一个PC的程序,Unix或Windows,能通过对局域网内所有IP地址的ping,找到arp表里的MAC地址
如果,你的电脑和树莓派连在了同一个局域网中。如何从它的MAC地址知道它的IP呢?
教程目标:
写一个PC的程序,Unix或Windows,能通过对局域网内所有IP地址的ping,找到arp表里的MAC地址和IP地址对应关 系,根据RPi的MAC段找到局域网内的RPi的IP地址。
教程器材及软件:
- 树莓派的板子。
- SD卡(已经有镜像刷入)。
- 电源线及USB充电器。
- putty和psftp。(可以到http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载)
- 有DHCP的网线。
原理:
原理其实比较简单,就是arp表和ping的原理。在http://blog.163.com/woxiangxin5@126/blog/static/210450682008102234334173/ 中有比较好的介绍,在此就不重复了。
代码:
- 代码也十分简单,就是先从命令行参数中读入,主机IP地址和树莓派的MAC地址。(主机IP可以用ipcofig命令查看,树莓派MAC地址可以用ifconfig在树莓派中查看。)
- 将主机所在的网段全部ping一遍。(此时使用的system()函数,在stdlib.h中。)
- 然后,再用arp -a 读出arp表,用树莓派的MAC地址找出树莓派IP地址。
#include
#include
#include
#include
void help(void);
void ping_all_ip(const char* local_host_address);
void resolve_arp_tables(char* mac_address,char* ip_address);
int main(int argc,char** argv)
{
char ip_address[20];
if(argc!=3)
{
help();
return -1;
}
ping_all_ip(argv[1]);
resolve_arp_tables(argv[2],ip_address);
puts("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
printf("Your raspberry's IP is %s\n",ip_address);
puts("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
return 0;
}
void help(void)
{
puts("find_your_raspberry is used to find your raspberry in the"
"local network.You should run it like find_your_raspberry "
"(local computer IP in the LAN) (The MAC of your raspberry).");
}
void ping_all_ip(const char* local_host_address)
{
char address[256];
char num[10];
char*p = NULL;
strcpy(address,local_host_address);
assert((p=strstr(address,"."))!=NULL);
p++;
assert((p=strstr(p,"."))!=NULL);
p++;
assert((p=strstr(p,"."))!=NULL);
p++;
*p='\0';
//for(int i=100;i<110;i++)
for(int i=0;i<256;i++)
{
char command[512]="ping -n 1 -w 20 ";
itoa(i,num,10);
strcat(address,num);
strcat(command,address);
puts(command);
system(command);
*p='\0';
}
}
char* strip(char* str)
{
while(*str==' ' && *str!='\0')
{
str++;
}
int len = strlen(str);
while(str[len-1]==' ')
{
len--;
str[len]='\0';
}
return str;
}
void resolve_arp_tables(char* mac_address,char* ip_address)
{
char line[256];
FILE *file=NULL;
ip_address[0] = '\0';
system("arp -a>>temp");
assert((file=fopen("temp","r"))!=NULL);
while(!feof(file))
{
char* p=NULL;
fgets(line,sizeof(line),file);
p=strstr(line,mac_address);
if(p!=NULL)
{
*p='\0';
strcpy(ip_address,strip(line));
break;
}
}
fclose(file);
system("del temp");
}
步骤:
- 将树莓派组装好后,接上电源。
- 查看主机IP地址。
- 查看树莓派的MAC地址。
- 编写代码。
- 编译执行。
- 结果:
备注:
此教程为浙江大学计算机学院嵌入式系统的扩展实验报告。