Отправка и получение пакетов UDP в .NET - PullRequest
3 голосов
/ 14 июля 2011

Я пытаюсь проверить связь UDP в локальной сети.У меня есть небольшой фрагмент кода, и я попытался запустить его на 2 компьютерах (один должен ждать, чтобы получить, а другой должен отправить).Странно то, что компьютер A отправляет, а B получает должным образом, но если я попытаюсь A получить и B отправить, это не сработает.Вы знаете, почему это может быть?

public void SendBroadcast(int port, string message)
    {
        UdpClient client = new UdpClient();
        byte[] packet = Encoding.ASCII.GetBytes(message);

        try
        {
            client.Send(packet, packet.Length, IPAddress.Broadcast.ToString(), port);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

public void Receive(int port)
    {
        UdpClient client = null;

        try
        {
            client = new UdpClient(port);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

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


        while (true) 
        {
            try
            {
                byte[] packet = client.Receive(ref server);
                Console.WriteLine("{0}, {1}", server, Encoding.ASCII.GetString(packet));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

И вызовы:

  SendBroadcast(444, "hello"); Receive(444);

Если я запускаю 2 экземпляра программы на одном компьютере, она работает правильно, но создает 3 пакета за вызов.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 14 июля 2011

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

1 голос
/ 14 июля 2011

Ну, если один и тот же код работает на одном, а не на другом, это ваша среда. Проверьте настройки брандмауэра, убедитесь, что он не запрещает широковещательную рассылку на отправителя и не препятствует получению на получателе. Wireshark (или даже netmon для Windows) должен быть здесь полезен.

0 голосов
/ 15 августа 2011

Пытаясь сделать это асинхронно, Microsoft игнорирует указание пользователям создавать собственный частичный класс, подобный этому (см. Ниже).Очень просто, но без этого может быть трудно прочитать их примеры.

private partial class UdpState
{
    public UdpClient u;
    public IPEndPoint e;
}
0 голосов
/ 14 июля 2011

Какое сетевое устройство находится между этими двумя системами?

Две системы в одной подсети с одинаковой маской подсети?

Есть странная вещь с сетями IPV4; Вы можете иметь несколько широковещательных адресов . Вы можете вещать в локальной сети или в локальной подсети. Это совершенно разные адреса, и, если настройки IP одной системы отличаются, она может не осознавать, что должна прослушивать эту локальную рассылку подсети.

Что попробовать:

  1. Убедитесь, что IPV6 отключен на обоих концах (IPV6 не поддерживает широковещательный адрес, но позволяет просто установить базовый уровень).
  2. Точно установить IP-адрес в программе, он работает? Мое предположение будет да, поэтому мы должны определить, почему.
  3. Загрузите wireshark и понюхайте пакеты. Посмотрите, проходят ли они весь путь до удаленного хоста, а он просто игнорирует их.
...