Передачи UDP не принимаются отправителем - PullRequest
4 голосов
/ 16 сентября 2009

Платформа: Windows 2003 R2, C #

У меня есть приложение, которое отправляет UDP-сообщения другим экземплярам себя, работающим на том же компьютере и на других компьютерах. Это работает нормально. Но на некоторых компьютерах слушатель не может слышать сообщения, переданные другим потоком / процессом на том же компьютере. Сообщение передается нормально, и другие устройства в сети слышат сообщение, но прослушиватель на том же компьютере не может услышать сообщение.

Странная часть в том, что это происходит на НЕКОТОРЫХ машинах в моей тестовой среде, но не на всех.

Редактировать: на всех машинах, на которых произошел сбой, установлено клиентское программное обеспечение Check Point VPN-1 Securemote. Я взял машину, которая работала, установил VPN-клиент, и теперь он не работает. Обратите внимание, что я не подключен ни к одному VPN-узлу, у меня просто установлен клиент.

Все машины имеют один сетевой адаптер, маску подсети 255.255.255.0 и IP-адрес 10.3.10.xxx.

Вот тестовый класс, который демонстрирует проблему. Пользователь вводит некоторый текст, и он отправляется на 10.3.10.255. На некоторых машинах функция ReceiveFrom возвращает, а на других - нет. Я звоню контроллеру («10.3.10.255», 33333)

public class Controller
{
    public Controller(IPAddress broadcastAddress, int port)
    {
         _broadcastAddress = broadcastAddress;
         _port = port;
    }

    public void Start()
    {
        Socket s = null;

        try
        {
             IPEndPoint _listenEndpoint = new IPEndPoint(IPAddress.Any, _port);
            _broadcastEndpoint = new IPEndPoint(_broadcastAddress, _port);

            s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
            s.EnableBroadcast = true;
            s.Bind(_listenEndpoint);

            SocketState receiveState = new SocketState();
            receiveState.s = s;
            receiveState.buf = new byte[1024];

            EndPoint lep = (EndPoint)_broadcastEndpoint;

            s.BeginReceiveFrom(receiveState.buf, 0, receiveState.buf.Length, SocketFlags.None, ref lep, new AsyncCallback(OnReceive), receiveState);

            bool done = false;
            while (!done)
            {
                string msg = Console.In.ReadLine();
                byte[] msg_bytes = Encoding.ASCII.GetBytes(msg);

                if (msg_bytes.Length == 0)
                    done = true;
                else
                {
                    Console.Out.WriteLine("---> {0}", msg);
                    s.SendTo(msg_bytes, msg_bytes.Length, SocketFlags.None, new IPEndPoint(_broadcastAddress, _port));
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            if (s != null)
                s.Close();
        }
    }

    internal void OnReceive(IAsyncResult ar)
    {
        SocketState state = ar.AsyncState as SocketState;
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
        EndPoint ep = (EndPoint)ipep;

        int nRead = state.s.EndReceiveFrom(ar, ref ep);

        IPEndPoint myipep = ep as IPEndPoint;

        Console.WriteLine("<--- {0} {1}", myipep.Address.ToString(), System.Text.Encoding.ASCII.GetString(state.buf, 0, nRead));

        EndPoint lep = (EndPoint)_broadcastEndpoint;
        state.s.BeginReceiveFrom(state.buf, 0, state.buf.Length, SocketFlags.None, ref lep, new AsyncCallback(OnReceive), state);
    }

    IPAddress _broadcastAddress;
    int _port = 0;
    IPEndPoint _broadcastEndpoint;
}

internal class SocketState
{
    internal Socket s;
    internal byte[] buf;
}

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Что делает клиентское программное обеспечение Check Point VPN-1 Securemote? Похоже, что это может сделать какой-то брандмауэр, в этом случае он будет блокировать данные, поступающие на указанный порт.

1) Если вы можете настроить его так, чтобы данные проходили через этот порт, тогда вам следует идти дальше.

2) Другим менее вероятным вариантом является то, что, возможно, он прослушивает порт, который вы пытаетесь прослушать, и в этом случае он получает пакет udp, а не ваше приложение. Я ожидаю, что ваше приложение выдаст ошибку, хотя в этом случае.

0 голосов
/ 17 сентября 2009

В настройках SecureClient (щелкните правой кнопкой мыши значок в области уведомлений и выберите «Настройки») на вкладке «Безопасность» можно включить параметр «регистрировать все соединения, заблокированные политикой безопасности рабочего стола».

После этого вы сможете увидеть, действительно ли это блокирует ваше приложение - если это так, вам придется изменить политику по умолчанию, чтобы разрешить ваше приложение. Я не уверен, как это сделать - я никогда не администрировал серверную часть SecureRemote, но уверен, что Check Point может помочь вам, если ваши сетевые администраторы не смогут.

...