13

ローカル ネットワークで簡単な UDP 通信を機能させようとしています。

私がやりたいことは、ネットワーク上のすべてのマシンにマルチキャストを行うことだけです

これが私の送信コードです

    public void SendMessage(string message)
    {
        var data = Encoding.Default.GetBytes(message);
        using (var udpClient = new UdpClient(AddressFamily.InterNetwork))
        {
            var address = IPAddress.Parse("224.100.0.1");
            var ipEndPoint = new IPEndPoint(address, 8088);
            udpClient.JoinMulticastGroup(address);
            udpClient.Send(data, data.Length, ipEndPoint);
            udpClient.Close();
        }
    }

ここに私の受信コードがあります

    public void Start()
    {
        udpClient = new UdpClient(8088);
        udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50);

        receiveThread = new Thread(Receive);
        receiveThread.Start();
    }

    public void Receive()
    {
        while (true)
        {
            var ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
            var data = udpClient.Receive(ref ipEndPoint);

            Message = Encoding.Default.GetString(data);

            // Raise the AfterReceive event
            if (AfterReceive != null)
            {
                AfterReceive(this, new EventArgs());
            }
        }
    }

ローカル マシンでは完全に動作しますが、ネットワーク経由では動作しません。

-ファイアウォールではないようです。両方のマシンで無効にしましたが、それでも機能しませんでした。

-クライアントマシンのハードコードされたIPアドレスに直接送信すると機能します(つまり、マルチキャストではありません)。

どんな助けでも大歓迎です。

4

3 に答える 3

8

ローカル ネットワーク ハードウェアはIGMPをサポートしていますか?

スイッチがマルチキャストに対応している可能性がありますが、IGMP が無効になっていると、接続されているハードウェアが特定のマルチキャスト グループにサブスクライブしているかどうかが認識されないため、それらのパケットは転送されません。

これをテストするには、一時的に 2 台のマシンをクロスオーバー ケーブルで直接接続します。それは(AFAICR)常に機能するはずです。

また、 にTTL 引数が提供されるのは、クライアント側ではなく、サーバー側のコードである必要がありますJoinMulticastGroup()

于 2009-04-20T09:53:03.240 に答える
4

私は似たようなことに4時間費やしました(私は思う)、私にとっての解決策は次のとおりでした:

client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT));
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First());
client.MulticastLoopback = true;

マルチキャスト グループで特定の (最初の外部) IP アドレスを使用する。

于 2013-05-31T11:03:34.870 に答える
0

コードのどこにもTTLが指定されていません。TTL はもともと単位秒であることが意図されていましたが、単位ホップになっていることに注意してください。これは、巧妙な TTL を使用することで、ルーターの通過をなくすことができることを意味します。私のマシンのデフォルトの TTL は 32 です。これで十分だと思います。ただし、システムが何らかの形のセキュリティ ロックダウンを通過している場合は、実際には異なる場合があります (UdpClient.Ttl)。

個人的に多くの実験を行う必要があるため、必要な TTL を推奨することはできません。

それでもうまくいかない場合は、次の記事をご覧ください。

全体として、UdpClient ではなく Socket を使用して成功したようです。

選択したマルチキャスト グループは、ローカル専用にすることもできます。別のものを試してください。

物理ネットワーク層も問題を引き起こしている可能性があります。スイッチと直接 (x-over) 接続について質問してみます。ハブとよりインテリジェントなすべてのものは、それらをうまく処理する必要があります。ただし、それを裏付ける文献はありません。

于 2009-04-20T07:37:23.457 に答える