0

すべてのネットワーク インターフェイス (2 つの LAN、1 つの Wi-Fi) でマルチキャスト パケットを送信しようとしています。私は最初にこのチュートリアルに従いました。

私が遭遇する問題は、パケットが私の IP アドレスの 1 つだけにあるように見えることです。

これが私の現在のコードです。

private static void SendOnAllCards(int port, String address)
{
    using (Socket mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
    {
        mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                    new MulticastOption(IPAddress.Parse(address)));
        mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255);
        mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        mSendSocket.Bind(new IPEndPoint(IPAddress.Any, port));
        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(address), port);
        mSendSocket.Connect(ipep);


        byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message");
        mSendSocket.Send(bytes, bytes.Length, SocketFlags.None);
    }
}

私は手動でそれをやろうとしました:

private static void SendOnAllCards(int port, string remoteAddressSrc)
{
    foreach (IPAddress remoteAddress in Dns.GetHostAddresses(Dns.GetHostName()).Where(i=>i.AddressFamily == AddressFamily.InterNetwork))
    {

        using (Socket mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
        {
            mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        new MulticastOption(IPAddress.Parse(remoteAddressSrc)));
            mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255);
            mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            mSendSocket.Bind(new IPEndPoint(IPAddress.Any, port));
            IPEndPoint ipep = new IPEndPoint(remoteAddress, port);
            mSendSocket.Connect(ipep);


            byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message");
            mSendSocket.Send(bytes, bytes.Length, SocketFlags.None);
        }
    }
}

これは機能しますが、IP と同じ数のソケットを作成する必要があることを意味します (このサンプルでは、​​送信ごとにソケットを作成しますが、これは単なるテストです)、取得する方法が好きではありません私のすべてのIP。

それで、これを行う正しい方法は何ですか?

2 つ目のおまけの質問を編集Connect:リモート アドレスを指定する でローカル IP を指定すると、なぜこれが機能するのBindですか?

4

2 に答える 2

1

ネットワーク インターフェイスを反復処理し、ローカル IP で Bind を作成し、Send* To * 呼び出しを行う必要があるようです。

public void SendTestMessage()
{
    foreach (IPAddress localIp in
        Dns.GetHostAddresses(Dns.GetHostName()).Where(i => i.AddressFamily == AddressFamily.InterNetwork))
    {
        IPAddress ipToUse = localIp;
        using (var mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
        {
            mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        new MulticastOption(_multicastIp, localIp));
            mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255);
            mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            mSendSocket.MulticastLoopback = true;
            mSendSocket.Bind(new IPEndPoint(ipToUse, _port));


            byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message");
            var ipep = new IPEndPoint(_multicastIp, _port);
            mSendSocket.SendTo(bytes, ipep);
        }
    }
}
于 2013-03-08T14:23:52.847 に答える
0

WMI クラスを使用して、ネットワーク アダプターを見つけることができますWin32_NetworkAdapter。Windows とサード パーティのソフトウェアの両方によって作成された多くの「仮想アダプター」があるため、そのインスタンスのクエリがもたらす結果を絞り込む必要がある場合があります。WMI を使用してアダプターを取得する簡単な posh スクリプトを作成しました。これにより、IP アドレスを持つアダプターのみが表示されます。これは、アクティブなアダプターを取得するために照会できる WMI 情報を表示するためのものです。

$networkadapters = @(Get-CimInstance -ClassName Win32_NetworkAdapter -Property *)
$networkadapters_configs = @($networkadapters | Get-CimAssociatedInstance -ResultClassName Win32_NetworkAdapterConfiguration)

0..($networkadapters.Length-1) | %{
    if($networkadapters_configs[$_].IPAddress -gt '') {
        Write-Output "Adapter #$($_)" 
        Write-Output $networkadapters[$_]
        Write-Output "Config #$($_)" 
        Write-Output $networkadapters_configs[$_]
    }
}
于 2013-03-06T16:03:21.790 に答える