2014-10-29 123 views
1

有沒有可能通過Boost.Asio獲得給定IPv4地址的「真實本地」廣播地址?如何使用Boost.Asio解析IPv4地址的實際廣播地址

ip::address_v4::netmask僅返回基於IPv4地址等級的網絡掩碼,因此在ip::address_v4::broadcast的過載情況下無法可靠使用。

我需要解析本地計算機上給定(現有)主機IPv4地址的特定廣播地址,因爲我無法使用廣播地址爲255.255.255.255的UDP端點。

編輯:爲了澄清,我不想將主機名解析爲IP地址,反之亦然。

編輯:下面是一個例子:

eth0: 

host address: 192.168.0.1 
net mask...: 255.255.0.0 (**not** class C) 

所以我要檢索的廣播地址192.168.255.255,但我想指定唯一的輸入是本地網絡地址。因此,「解決」或「查詢」是正確的術語,因爲我不想計算它。

我有一個UDPv4服務器,我將其綁定到特定的本地端點(通過指定本地IPv4主機地址)。我想在單播模式和廣播模式下使用此服務器,所以我需要指定遠程端點。我無法使用由ip::address_v4::broadcast返回的「全局廣播」地址執行此操作,因爲該操作始終會返回255.255.255.255,這會導致意外行爲。除了主機地址之外,我還指定了一個標誌來正確設置套接字選項,以便通過basic_datagram_socket::broadcast啓用廣播。

如果你有一個例子如何實現這一點,我將不勝感激。也許我的想法太複雜了......

+0

您是否嘗試將廣播地址設置爲地址本身?另一個問題:你嘗試播放嗎? http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/reference/ip__address_v4/broadcast.html – Tanuki 2014-10-29 18:19:45

+1

@巴里那個鏈接是完全不相關的。你只是對「解決」這個詞做出迴應(我覺得這個詞在這裏被濫用了) – sehe 2014-10-29 20:44:51

+1

@Florian在所有應有的尊重下,我很困惑你爲什麼低估了我的答案,我在那裏展示了**完全**如何在網絡掩碼中使用'address_v4 :: broadcast'。你聲稱'broadcast()'總是返回255.255.255。255只是無效的,而且你實際上已經讀到了答案,完成了所顯示的輸出,你已經看到了。此外,不,這是**不**所謂的決議。你可能想稱它爲派生或計算。要解決在IP上下文中的具體含義,請使用命名服務來解析主機或服務地址。 – sehe 2014-10-29 23:30:08

回答

3

我覺得確實是boost::asio::ip::address_v4::broadcast重載是你所追求的:

#include <boost/asio.hpp> 
#include <iostream> 

using boost::asio::ip::tcp; 

int main() { 
    typedef boost::asio::ip::address_v4 A; 

    A address = A::from_string("192.168.0.1"); 

    std::cout << "Address " << address << " has broadcast address " << A::broadcast(address, A::from_string("255.255.0.0")) << "\n"; 
} 

打印:

Address 192.168.0.1 has broadcast address 192.168.255.255 

看到它Live On Coliru

備註注意:如果混淆來自192.168.0.1被分類爲Class C,這是設計。

IANA定義了16位塊192.168.0.0/16作爲「256個連續的C類網絡」(看Classful description here的腳註是啓發,而短耳執行匹配它)。

+0

不,您的回答正如我在問題第二段所述。 'boost :: asio :: ip :: address_v4 :: broadcast'根據IPv4地址類來計算廣播地址。我想獲取**本地** IPv4地址(例如'eth0')的真實廣播地址。我會爲我的問題添加一個例子。 – 2014-10-29 21:53:13

+2

@FlorianWolters在你澄清你的問題後,我簡化了我的答案。希望這可以幫助。 (注意:這個答案已經存在了,我剛剛刪除了看起來讓你感到困惑的DNS查找) – sehe 2014-10-29 23:26:10

+1

另外,在我的答案結尾處添加了關於C類網絡的註釋,以防萬一。 – sehe 2014-10-29 23:47:14