注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

吉大释然

0101 0100 0010 1011

 
 
 

日志

 
 

在局域网中找到你的Raspberry Pi ----编程或快速方法  

2013-03-05 00:31:30|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原理

即使用我们常用的ping方法,枚举着尝试连接局域网内可能的IP范围。(如192.168.1.100-255)。一般在ping通后arp表会被更新,记录下对方的MAC地址。这时候,只需要查询ARP表,找到相应的MAC地址,即能反查其所在的IP了。

实现

LZ在Ubuntu下实验了两种方法。第一种方法简单高效,但是需要一个附加的开源工具nmap,另一个只是纯粹利用系统已有的命令进行的编程。

快速方法

  1. 首先,安装我们需要的开源工具nmap
  2.         nmap是一个开源的网络探索和安全审视工具。其设计的目的是用于快速地扫描大规模网络(当然,对于单个主机也能使用)。除了我们需要用到的简单ping联通测试,还能检查某个host开启地端口与服务。有兴趣的可以参见其文档,或网站 http://nmap.org/book/man.html

    sudo apt-get install nmap

  3. 使用namp扫描局域网
  4. nmap -sn xxx.xxx.xxx.xxx/24 -T4

    其中

    • -sn 不开启端口扫描
    • xxx.xxx.xxx.xxx 为您所在局域网的一个ip
    • /24 表示了扫描范围,即24表示ip的前24个二进制位固定不动,枚举剩余的
    • -T4 开启4级加速。之所以使用nmap,正是因为它非常快,尤其是在开启这加速后。如图,加速后扫描256个IP只要5秒。
    • 在局域网中找到你的Raspberry Pi ----编程或快速方法 - yzchen1991 - 吉大释然
  5. 得到arp列表并找到您的设备
  6. arp -a | grep xx:xx:xx:xx

    其中

    • xx:xx:xx:xx为您设备的MAC地址。

在局域网中找到你的Raspberry Pi ----编程或快速方法 - yzchen1991 - 吉大释然
 

*当然,也有一个小程序,编译以后以ip地址和MAC地址为参数输入即可。

#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>

int main(int argc,char **argv)
{
char comm[255];
int i;

if (argc != 3){
printf("Usage : %s <IP> <Raspberry Pi's MAC>\n", argv[0]);
return 0;
}

sprintf(comm,"nmap -sn %s/%d",argv[1],24);
system(comm);

system("arp -a > /tmp/iplog.tmp");
sprintf(comm,"cat /tmp/iplog.tmp | grep %s",argv[2]);
system(comm);

return 0;
}



程序实现

程序实现相对来说就比较直白了。

  1. 遍历ping此局域网内所有的ip,更新arp。重点在于ip字符串的检查
  2. 读取arp临时文件,查找与mac匹配的字符串。
在局域网中找到你的Raspberry Pi ----编程或快速方法 - yzchen1991 - 吉大释然

 *在程序中,为了更快地遍历,采用了双进程加速。
**编程方法的速度比快速方法要慢,主要是在ping上

#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>

#define FALSE 0
#define TRUE 1

int getAndCheckIP(char* ip,int* subIP);

int main(int argc,char **argv)
{
char comm[255];
char logItem[255];
int i;
int subIP[4];
pid_t pid1,pid2;
FILE *temFile;

if (argc != 3){
printf("Usage : %s <IP> <Raspberry Pi's MAC>\n", argv[0]);
return 0;
}

if (!getAndCheckIP(argv[1],subIP)){
perror("IP address Invalid!");
exit(EXIT_FAILURE);
}

//Use 2 process to speed up ping
pid1 = fork();
if (pid1 < 0){
perror("fork failed!");
exit(EXIT_FAILURE);
}
if (pid1 == 0){
for (i = 0;i < 128;i++){
sprintf(comm,"ping -w 1 -c 1 %d.%d.%d.%d > /dev/null 2>&1",subIP[0],subIP[1],subIP[2],i);
printf("PING %d.%d.%d.%d\n",subIP[0],subIP[1],subIP[2],i);
system(comm);
}


}
else if (pid1 > 0){
for (i = 128;i < 256;i++){
sprintf(comm,"ping -w 1 -c 1 %d.%d.%d.%d > /dev/null 2>&1",subIP[0],subIP[1],subIP[2],i);
printf("PING %d.%d.%d.%d\n",subIP[0],subIP[1],subIP[2],i);
system(comm);
}

//Wait for 2nd process to finishi its job
wait(pid1,NULL,0);

//Refresh arp list, save result to temp file
printf("Refreshing ARP list...\n");
system("arp -a > artTmp.tmp");

//Read and analyze the file
temFile = fopen("artTmp.tmp","r");
if (!temFile){
perror("FileSystem error!");
exit(EXIT_FAILURE);
}

int inFlag = FALSE;
while (fgets(logItem,255,temFile)){
if (strstr(logItem,argv[2])){
if (!inFlag){
printf("=======Here is your Device======\n");
inFlag = TRUE;
}
printf("%s\n", logItem);
}
}
if (!inFlag) {
printf("Sorry Can't find your Device\n");
}
}


return 0;
}

int getAndCheckIP(char* ip,int* subIP)
{
int i;
int sub,indSub;

i = 0;
indSub = 0;
sub = 0;

while(i < strlen(ip)){
if (ip[i] == '.'){
subIP[indSub] = sub;
indSub++;
sub = 0;
}
else if (ip[i] > '9' || ip[i] < '0'){
return FALSE;
} else {
sub = sub * 10 + (ip[i] - '0');
if (sub > 255){
return FALSE;
}
}

i++;
}

if (indSub != 3){
return FALSE;
} else {
return TRUE;
}
}









浙江大学嵌入式课程 非荣誉出品
Copyright 2013 by Yizhe CHEN






  评论这张
 
阅读(104)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018