簡體   English   中英

在具有本機C ++的Windows上具有多個網絡適配器的計算機上的UDP廣播

[英]UDP broadcast on machine with multiple network adapters on Windows with native C++

我需要在具有多個使用本機C ++代碼的網絡適配器的Windows機器上進行UDP廣播(我認為最好是多播)。

目前,我正在套接字上設置SO_BROADCAST套接字選項以允許廣播,然后將其發送到INADDR_BROADCAST地址(255.255.255.255)。 這在具有多個網絡適配器的計算機上無法可靠地工作。

我一直在搜索,在Stack Overflow上發現了很多與此有關的問題。 據我所知,最好的方法似乎是找出每個網絡適配器的廣播IP,然后遍歷發送給每個網絡適配器的IP。

因此,例如,如果我的計算機具有一個IP地址為10.0.0.x的網絡適配器,另一個IP地址為192.168.1.x的網絡適配器,那么我需要將消息發送到10.0.0.255和192.168.1.255。

盡管我已經瀏覽過所有問題/答案,但我仍無法將所有問題聯系起來以獲得上述地址列表。

誰能指出我正確的方向? 例如,我找到了一些使用GetAdaptersAddresses枚舉IP地址的示例代碼,但是我看不到在哪里可以獲取每個地址的子網掩碼。 沒有子網掩碼,我無法確定廣播地址。 我需要IP地址列表,以及每個IP地址的子網掩碼,這樣我才能形成要發送到的廣播地址列表。

API調用GetAdaptersInfo為每個網絡適配器填充IP_ADAPTER_INFO結構。 根據文檔,掩碼在地址列表中提供:

http://msdn.microsoft.com/zh-CN/library/windows/desktop/aa366062(v=vs.85).aspx

一旦有了IP地址和掩碼,就可以計算廣播地址:

從IP和子網掩碼計算廣播地址

RichardBrock的答案是正確的,GetAdaptersInfo提供了所需的信息。 這是一些代碼,更具體地顯示了如何執行此操作。 請注意,此代碼使用MFC和字符串轉換宏STR_A2T,該宏僅在為Unicode構建項目時才將char *字符串轉換為wchar_t *字符串。 結果是一個字符串數組,其中每個字符串都是一個廣播IP。 然后,我們只需遍歷這些內容並發送給每個人。

CStringArray baList;
baList.RemoveAll();

ULONG bufSz = 0;
if (GetAdaptersInfo(NULL,&bufSz) == ERROR_BUFFER_OVERFLOW)
{
    vector<BYTE> buf;
    buf.resize(bufSz,0);
    if (GetAdaptersInfo((IP_ADAPTER_INFO*)&buf[0],&bufSz) == ERROR_SUCCESS)
    {
        IP_ADAPTER_INFO* pAdapterInfo = (IP_ADAPTER_INFO*)&buf[0];
        for(; pAdapterInfo != NULL; pAdapterInfo = pAdapterInfo->Next)
        {
            unsigned long ip = inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
            unsigned long mask = inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
            unsigned long bcip = ip | ~mask;
            struct in_addr ia;
            ia.S_un.S_addr = bcip;
            CString broadcastAddr;
            STR_A2T(inet_ntoa(ia),broadcastAddr);
            baList.Add(broadcastAddr);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM