2

ネイティブ C++ コードを使用して、複数のネットワーク アダプターを備えた Windows マシンで UDP ブロードキャストを実行する必要があります (代わりに、理想的にはマルチキャストにする必要があることを認識しています)。

現在、ソケットに SO_BROADCAST ソケット オプションを設定してブロードキャストを許可し、INADDR_BROADCAST アドレス (255.255.255.255) に送信しています。これは、複数のネットワーク アダプタを備えたマシンでは確実に機能しません。

私はいろいろと調べていて、Stack Overflow でこれに関するたくさんの質問を見つけました。私が知る限り、最良のアプローチは、各ネットワーク アダプターのブロードキャスト IP を把握し、各ネットワーク アダプターに送信する IP をループすることです。

したがって、たとえば、マシンに IP アドレスが 10.0.0.x のネットワーク アダプターと 192.168.1.x の別のネットワーク アダプターがある場合、メッセージを 10.0.0.255 と 192.168.1.255 に送信する必要があります。

私が調べたすべての質問/回答にもかかわらず、ドットを接続して上記のアドレスのリストを取得することはできませんでした.

誰かが私を正しい方向に向けることができますか? たとえば、GetAdaptersAddresses を使用して IP アドレスを列挙するサンプル コードをいくつか見つけましたが、各アドレスのサブネット マスクをどこで取得できるかわかりません。サブネット マスクがないと、ブロードキャスト アドレスを特定できません。送信先のブロードキャスト アドレスのリストを作成できるように、IP アドレスのリストとそれぞれのサブネット マスクが必要です。

4

2 に答える 2

4

API 呼び出し GetAdaptersInfo は、各ネットワーク アダプターの IP_ADAPTER_INFO 構造体を埋めます。ドキュメントによると、マスクはアドレスのリストで提供されます。

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

IP アドレスとマスクを取得したら、ブロードキャスト アドレスを計算できます。

IPとサブネットマスクからブロードキャストアドレスを計算

于 2013-03-14T23:55:09.880 に答える
2

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);
        }
    }
}
于 2013-03-15T01:54:00.997 に答える