Mehdi Gholam Ответов: 2

Использование udpclient с несколькими сетевыми адаптерами


Я использую UdpClient который прекрасно работает с одним адаптером, но на машине с установленным hyper-v (несколькими виртуальными адаптерами) код не получает ответа.

Кто-нибудь сталкивался с этим и обходным путем?

Что я уже пробовал:

private string DoUDPSearch(int port)
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    string ipaddr = "";
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            try
            {
                var Client = new UdpClient();
                Client.Client.SendTimeout = 2000;
                Client.Client.ReceiveTimeout = 2000;
                var RequestData = Encoding.ASCII.GetBytes("SomeRequestData");
                var ServerEp = new IPEndPoint(ip, 0);

                Client.EnableBroadcast = true;
                Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, port));

                var ServerResponseData = Client.Receive(ref ServerEp);
                var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);
                //Console.WriteLine("Recieved {0} from {1}", ServerResponse, ServerEp.Address.ToString());
                ipaddr = ServerEp.Address.ToString();
                logger("Server IP = " + ServerEp.Address);
                Client.Close();

                return ipaddr;
            }
            catch { Console.WriteLine("unable to connect."); }
        }
    }
    logger("Server IP not found.");
    return ipaddr;
}

Afzaal Ahmad Zeeshan

Протокол UDP сам по себе не гарантирует никакого ответа или доставки. Это работа TCP. Работает ли TCP нормально в этом случае, так как я не работал в виртуализированной системе адаптеров?

Я работал с "TCP или UDP case" 2 года назад и оставил его использование в пользу TCP. UDP имеет тенденцию быть быстрым,поэтому он продолжает отбрасывать все.

В любом случае, взгляните на эта тема.

Richard MacCutchan

Вы уверены, что у вас есть сетевые пути между всеми узлами? Получали ли удаленные устройства широковещательные сообщения?

Mehdi Gholam

Нашел проблему с большим количеством возни... (ви-Хи!!), см. Решение 2

2 Ответов

Рейтинг:
7

Mehdi Gholam

Нашел проблему, клиент должен отправить с портом = 0 [ServerEp] и он получит ответ на правильный порт сервера (если вы установите клиентский порт send равным = порту сервера [ServerEp] это всегда будет работать независимо от того, что вы не хотите).

Правильный код приведен ниже:

private string DoUDPSearch(int port)
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    string ipaddr = "";
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            try
            {
                var ServerEp = new IPEndPoint(ip, 0);
                var Client = new UdpClient(ServerEp);
                Client.Client.SendTimeout = 2000;
                Client.Client.ReceiveTimeout = 2000;
                var RequestData = Encoding.ASCII.GetBytes("SomeRequestData");

                Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, port));

                var ServerResponseData = Client.Receive(ref ServerEp);
                var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);
                ipaddr = ServerEp.Address.ToString();
                logger("Server IP = " + ServerEp.Address);
                Client.Close();

                return ipaddr;
            }
            catch { Console.WriteLine("unable to connect."); }
        }
    }
    logger("Server IP not found.");
    return ipaddr;
}


Рейтинг:
2

El_Codero

Попробуйте увеличить размер буфера UDP вашей ОС хостов:

на выигрыш:

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet\Services\Afd\Parameters]

DefaultReceiveWindow = 10240
DefaultSendWindow = 10240


Пожалуйста, прокомментируйте, если это не помогло.


Mehdi Gholam

Но это не помогло.