局域网

局域网中在线PC端的信息获取

    我在最近项目中做的是获取网关的IP、MAC地址和在线PC的IP、MAC地址、主机名、操作系统。

接下来我对后半部分在线PC的信息的获取进行解说一下

1、获取在线PC的IP、MAC地址

<1>、ping dst-IP 

PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。

ping 遍网段中所有的IP,如果能ping通说明此目的IP在线,但是这种做法有弊端,就是有些人会在防火墙中“做一些手脚”,我们就无法ping通了,自然就无法得知该IP是否在线

<2>、ARP协议

ARP(Address Resolution Protocol),即地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

 SendARP(DestIp,SrcIp,&MacAddr,&PhysAddrLen)

关键代码:

#include <iphlpapi.h>

#pragma comment(lib, "iphlpapi.lib")

DWORD dwRetVal;

IPAddr DestIp = 0;

IPAddr SrcIp = 0;         

ULONG MacAddr[2];         

ULONG PhysAddrLen = 6;

dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);

if (dwRetVal == NO_ERROR) {......}

else{......}


2、获取在线PC的主机名

gethostbyaddr function

gethostbyaddr函数检索对应于网络地址的主机信息。

关键代码:

struct hostent *remotehost = gethostbyaddr((char *)&mLanThread_Ip_n, 4, AF_INET);

 if (remotehost == NULL)

 { 

      proc->put("hostname", 0);

 }

    else

{

     proc->put("hostname", remotehost->h_name);

}

3、获取在线PC的操作系统

端口号

计算机端口号 0 ~ 65535(16位)

普及:

在UDP和TCP的首部格式中,都有源端口号和目的端口号。当运输层收到IP层交上来的运输层报文时,就能够根据其首部中的目的端口号把数据交付给应用层的目的应用进程。

注意:端口号只具有本地意义,只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在因特网不同计算机中,相同的端口号是没有关联的。

运输层的端口号分为两大类:

服务器段使用的端口号

这里又分为两类,最重要的一类是系统端口号(数值0~1023)。IANA把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。另一类是登记端口号(数值1024~49151).这类端口号专门为没有系统端口号的应用程序使用的。

客户端口号(数值49152~65535)

这类端口号仅在客户进程运行时才动态选择,因此又叫短暂端口号。这类端口号是留给客户进程选择暂时使用的。当服务器进程收到客户进程的报文时,就知道客户进程所使用的端口号,因此可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就不复存在。这个端口号就可以供其他客户进程使用。

  疑问:我之前得到的消息,说抓包分析也可以判断,但是没有去实践过,大神们看了此文章可以给点帮助就更好了,文章中有什么疑问尽情提问。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章