热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lab在局域网中找到你的树莓派(windows平台)

如果,你的电脑和树莓派连在了同一个局域网中。如何从它的MAC地址知道它的IP呢?教程目标:写一个PC的程序,Unix或Windows,能通过对局域网内所有IP地址的ping,找到arp表里的MAC地址

如果,你的电脑和树莓派连在了同一个局域网中。如何从它的MAC地址知道它的IP呢?

教程目标:

写一个PC的程序,Unix或Windows,能通过对局域网内所有IP地址的ping,找到arp表里的MAC地址和IP地址对应关 系,根据RPi的MAC段找到局域网内的RPi的IP地址。

教程器材及软件:
  1. 树莓派的板子。
  2. SD卡(已经有镜像刷入)。
  3. 电源线及USB充电器。
  4. putty和psftp。(可以到http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载)
  5. 有DHCP的网线。
原理:

原理其实比较简单,就是arp表和ping的原理。在http://blog.163.com/woxiangxin5@126/blog/static/210450682008102234334173/ 中有比较好的介绍,在此就不重复了。

代码:
  1. 代码也十分简单,就是先从命令行参数中读入,主机IP地址和树莓派的MAC地址。(主机IP可以用ipcofig命令查看,树莓派MAC地址可以用ifconfig在树莓派中查看。)
  2. 将主机所在的网段全部ping一遍。(此时使用的system()函数,在stdlib.h中。)
  3. 然后,再用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");
}

步骤:
  1. 将树莓派组装好后,接上电源。
  2. 查看主机IP地址。

  3. 查看树莓派的MAC地址。

  4. 编写代码。
  5. 编译执行。
  6. 结果:

备注:

此教程为浙江大学计算机学院嵌入式系统的扩展实验报告。


推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
author-avatar
打完BOSS好睡觉1998
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有