2013-11-14 58 views
0

我們正在使用C/C++在Linux上開發服務器軟件,該軟件將限制來自Internet的那些請求的下載速率,但對於來自本地機器(內聯網)它不會設置任何限制。如何知道IP地址本地或不在Linux服務器上

問題是如何判斷IP地址是否是本地的,是否可以通過讀取一些網絡號碼設置(可能來自路由器?)通過c/C++來完成?

UPDATE
當我說本地ip時,我的意思是來自公司內部。例如,假設公司有三個子網(該公司只有一個到Internet的DSL鏈路),它們分別是10.123.1.xxx,172.16.1.xxx和192.168.1.xxx,然後是來自這三個子網的所有IP地址應視爲本地地址。

+1

這取決於你對「本地」的定義。你的意思是「同一個子網」(在這種情況下,查看子網掩碼),或者「在公司內部」(在這種情況下,測試你擁有的IP地址範圍);或者可能是「在防火牆後面」(在這種情況下,你可能會用'192.168','10.0'等開始......) – Floris

+0

@Floris我更新了帖子 – Steve

+0

@StevePeng查看更新回答 –

回答

0

私有地址範圍是:

10.0.0.0 - 10.255.255.255 (10/8 prefix) 

172.16.0.0 - 172.31.255.255 (172.16/12 prefix) 

192.168.0.0 - 192.168.255.255 (192.168/16 prefix) 

您可能還需要過濾掉鏈路本地地址(169.254/16)

然後,您可以分析您的代碼中的IP地址(以獲取你可以使用avahi或類似的地址,並將所有地址保存到一個文件,然後分別解析每個地址)並檢查它是否與這些地址相匹配。如果它不那麼限制其連接

編輯

你也可以考慮使用getifaddrs功能,將列出本地地址

+0

似乎getifaddrs只列出了服務器機器的ip地址,它不會列出網絡號碼裏面的內容。我錯了嗎? – Steve

+0

可能我只是在快速谷歌搜索中發現它,並沒有親自使用它。我使用avahi來顯示所有連接的網絡設備。如果您在本地機器上運行avahi -alrt,它將列出所有連接網絡上的所有機器。然後你可以使用sed/grep或其他東西來過濾這個表單,你可以通過你的C++代碼解析這些代碼,然後你可以用10.123.1.x開始檢查等等。沒有簡單的方法AFAIK直接用C++ –

0

如果您在本機的IP地址,運行traceroute請求一個連接,你應該能夠看到路由是否會引導你通過「公司外的網關」(通常是你的ISP)。我家的一個簡單例子就是我的內部路由器連接的時代華納網關。如果到客戶端的路由不通過ISP(如您所述,您有DSL鏈路;因此應該知道DSL端點的IP地址),那麼這是一個內部請求。這並不需要你知道公司內部IP地址的完整映射 - 你可以假設你的路由器已經想通了。

要獲取此信息,您可以在程序中運行系統命令並解析響應。

首先,從命令行(使用已知的「內部」和「外部」IP地址)運行它,並查看其差異。如果您需要進一步的幫助,請使用您收集的信息更新您的問題。