5

複数の NIC を搭載したコンピュータを使用していますが、UDPClient の send メソッドが頻繁に失敗します。コードは次のとおりです。

        private static void receiveData()
    {
        recvSock = new UdpClient(PORT);
        //recvSock.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, mainInterface);
        recvSock.JoinMulticastGroup(IPAddress.Parse(IP), 50);

        IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

        while (true)
        {
            byte[] data = recvSock.Receive(ref iep);

            // Do not include messages from us
            if (myIPs.Contains(iep.Address))
                continue;

            string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine("received: " + stringData);

        }
    }

PORT = 5000 および IP = 224.5.6.7 なので、問題ありません。主な問題は、recvSock.Receive() 行を通過できないことです。パケットがwireshark経由で入ってくるのが見えますが、コードはそれらを処理しません...

考え?前もって感謝します!

ダン

編集: 複数の NIC が問題を引き起こしていることを確認できます --- コードは単一の NIC で正常に動作します。SetSocketOption 行のコメントを外すと、複数の NIC で動作するようになりますが、それでも失敗します....

4

2 に答える 2

1

この投稿で同じ問題が見つかりましたが、次の場所で解決策を見つけました: UDP: すべてのネットワーク インターフェイスからデータを読み取る

基本的に 0.0.0.0 への Bind() は機能せず、すべてのローカル IP アドレスで Bind() と JoinMulticastGroup() を実行する必要があります。これはマイクロソフトが大好きです。

于 2013-10-24T14:15:51.317 に答える
0

インターフェイス部分は、次のコードの重要な部分です。

unsigned long interface;
ip_mreq mreq;

_parseHostname( _description->getInterface(), interface );
mreq.imr_multiaddr.s_addr = _writeAddress.sin_addr.s_addr;
mreq.imr_interface.s_addr = interface;

setsockopt( _readFD, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                (char*)&mreq, sizeof( mreq ));

インターフェイスは、受信ネットワーク カードの (ユニキャスト) IP アドレスです。

于 2010-07-06T14:09:28.533 に答える