局域網

局域網中在線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)

這類端口號僅在客戶進程運行時才動態選擇,因此又叫短暫端口號。這類端口號是留給客戶進程選擇暫時使用的。當服務器進程收到客戶進程的報文時,就知道客戶進程所使用的端口號,因此可以把數據發送給客戶進程。通信結束後,剛纔已使用過的客戶端口號就不復存在。這個端口號就可以供其他客戶進程使用。

  疑問:我之前得到的消息,說抓包分析也可以判斷,但是沒有去實踐過,大神們看了此文章可以給點幫助就更好了,文章中有什麼疑問盡情提問。


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