UDP Multicast не получает данные - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь написать простой клиент для получения многоадресных данных. Я пробовал много разных итераций, и ни одна из них не работает. Средой, которую я использую, является .netcore 2.2.2 и в среде Linux. Я вижу, что данные отправляются на соответствующий интерфейс через tcpdump, но мой клиент всегда зависает при получении. У меня также есть программа, написанная на Java предыдущим разработчиком, которая правильно получает данные от интерфейсов ниже, чтобы я мог подтвердить, что маршрут действительно работает.

Попытка # 1

mcastSocket = new Socket(AddressFamily.InterNetwork,
                         SocketType.Dgram,
                         ProtocolType.Udp);
IPAddress localIPAddr = IPAddress.Parse("10.51.254.2");
EndPoint localEP = (EndPoint)new IPEndPoint(localIPAddr, mcastPort);

mcastSocket.Bind(localEP);

mcastOption = new MulticastOption(mcastAddress, localIPAddr);

mcastSocket.SetSocketOption(SocketOptionLevel.IP,
                  SocketOptionName.AddMembership,
                  mcastOption);

EndPoint remoteEp = new IPEndPoint(mcastAddress, mcastPort);
// I have tried using (localIPAddr, mcastPort), (IPAddress.Any, 0),
// (localIPAddr, 0), (IPAddress.Any, mcastPort)

byte[] arr = new byte[4096];
Console.WriteLine("Socket setup");
var receivedBytes = mcastSocket.ReceiveFrom(arr, ref remoteEp );
Console.WriteLine("Got data");

Попытка # 2

UdpClient client = new UdpClient();

client.ExclusiveAddressUse = false;
IPEndPoint localEp = new IPEndPoint(IPAddress.Parse("10.51.254.2"), 14382);

client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.ExclusiveAddressUse = false;

client.Client.Bind(localEp);            
client.JoinMulticastGroup(IPAddress.Parse("224.0.31.130"), IPAddress.Parse("10.51.254.2"));

Console.WriteLine("Listening this will never quit so you will need to ctrl-c it");
IPEndPoint remoteEp = new IPEndPoint(IPAddress.Parse("224.0.31.130"), 14382);
EndPoint remoteEndPoint = (EndPoint) new IPEndPoint(IPAddress.Any, 0);
while (true)
{
    Byte[] data = client.Receive(ref remoteEndPoint);                
    Console.WriteLine("got data");
}

Любая помощь будет принята с благодарностью.

ИСПРАВЛЕНО, используя следующий код

try
{
    mcastSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    IPAddress localIPAddr = IPAddress.Parse("10.51.254.2");                
    IPEndPoint localEP = new IPEndPoint(IPAddress.Any, mcastPort);          
    mcastSocket.Bind(localEP);

    MulticastOption option = new MulticastOption(mcastAddress, localIPAddr);              
    mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, option);

    EndPoint remoteEp = new IPEndPoint(localIPAddr, mcastPort);

    byte[] arr = new byte[4096];

    while (true)
    {
        var receivedBytes = mcastSocket.ReceiveFrom(arr, ref remoteEp);
                    Console.WriteLine($"Got data {receivedBytes}");
    }
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...