locked
Проверка доступности UDP порта [C#] [XAML] RRS feed

  • Вопрос

  • Здравствуйте. Подскажите пожалуйста, как правильно проверить доступность UDP порта? Вот создал простенький пример того, как я это делаю:

    private string OpenStatus { get; set; }
    
            private async void Page_Loaded_1(object sender, Windows.UI.Xaml.RoutedEventArgs e)
            {
                DatagramSocket testudp = new DatagramSocket();
                testudp.MessageReceived += testudp_MessageReceived;
                // вместо 666 - указать открытый порт UDP
                await testudp.ConnectAsync(new HostName("localhost"), "666");
                var writer = new DataWriter(testudp.OutputStream);
                writer.WriteString("Nyaa");
                await writer.StoreAsync();
            }
    
            void testudp_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
            {
                try
                {
                    uint stringLength = args.GetDataReader().UnconsumedBufferLength;
                    args.GetDataReader().ReadString(stringLength);
                    OpenStatus = "Open";
                }
                catch
                {
                    OpenStatus = "Closed";
                }
            }

    Прямо на главной странице приложения одно свойство и два обработчика.

    Проблема в том, что если подключаться к открытому порту, то значение поля OpenStatus не изменяется. Если же попытаться проверить закрытый порт, то OpenStatus успешно установится в "Closed". Как же правильно присвоить OpenStatus = "Open"; в случае, если порт открыт? Спасибо за внимание.


    DreamSpark Premium User


    13 октября 2012 г. 20:59

Ответы

  • Вот придумал как проверить доступность UDP порта.

    private bool CheckUDPPort(string _ip, string _port)
            {
                bool PortStatus = true;
                DatagramSocket socket = new DatagramSocket();
                socket.MessageReceived += (DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) =>
                {
                    try
                    {
                        DataReader reader = args.GetDataReader();
                        uint len = reader.UnconsumedBufferLength;
                        string str = reader.ReadString(len);
                    }
                    catch
                    {
                        PortStatus = false;
                    }
                };
                socket.ConnectAsync(new HostName(_ip), _port).AsTask().Wait();
                DataWriter writer = new DataWriter(socket.OutputStream);
                writer.WriteString("Nyaaa");
                writer.StoreAsync().AsTask().Wait();
                return PortStatus;
            }


    DreamSpark Premium User

    • Предложено в качестве ответа ulcer 18 октября 2012 г. 4:42
    • Помечено в качестве ответа Abolmasov Dmitry 24 октября 2012 г. 11:35
    17 октября 2012 г. 20:03

Все ответы

  • Тут пример кода реализации UDP под windows 8. Посмотри, как они это делают.
    15 октября 2012 г. 7:27
  • Код написан в соответствии с этим примером. Но почему-то не удается присвоить значение при успешном доступе к порту


    15 октября 2012 г. 11:17
  • А ошибок никаких не валится?

    Если завернуть все в try, как в примере:

                try 
                { 
                    // Connect to the server (in our case the listener we created in previous step). 
                    await socket.ConnectAsync(hostName, ServiceNameForConnect.Text); 
                    //В примере они уже здесь, считают, что соединение открыто
                    // Mark the socket as connected. Set the value to null, as we care only about the fact that the property is set.
                    CoreApplication.Properties.Add("connected", null); 
                } 
                catch (Exception exception) 
                { 
                    // If this is an unknown status it means that the error is fatal and retry will likely fail. 
                    if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) 
                    { 
                        throw; 
                    } 
                 } 

    15 октября 2012 г. 12:17
  • Нет, никаких исключений не падает.


    DreamSpark Premium User

    16 октября 2012 г. 5:03
  • Привет.

    Да действительно так и есть, может недочет в примере. Исключение мне тоже не удалось вызвать. Тогда скорее всего вам остается считать сокет подключенным до первой ошибки, либо построить приложение-слушатель так, чтобы оно при коннекте сразу отсылало какую-либо "техническую" информацию, по которой клиент поймет, что он действительно подключился.


    Для связи [mail]

    16 октября 2012 г. 11:20
  • А суть была вот в чем: при успешном установлении соединения и отправке сообщения сервер просто не откликался никаким образом.

    :(


    DreamSpark Premium User

    17 октября 2012 г. 16:22
  • Вот придумал как проверить доступность UDP порта.

    private bool CheckUDPPort(string _ip, string _port)
            {
                bool PortStatus = true;
                DatagramSocket socket = new DatagramSocket();
                socket.MessageReceived += (DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) =>
                {
                    try
                    {
                        DataReader reader = args.GetDataReader();
                        uint len = reader.UnconsumedBufferLength;
                        string str = reader.ReadString(len);
                    }
                    catch
                    {
                        PortStatus = false;
                    }
                };
                socket.ConnectAsync(new HostName(_ip), _port).AsTask().Wait();
                DataWriter writer = new DataWriter(socket.OutputStream);
                writer.WriteString("Nyaaa");
                writer.StoreAsync().AsTask().Wait();
                return PortStatus;
            }


    DreamSpark Premium User

    • Предложено в качестве ответа ulcer 18 октября 2012 г. 4:42
    • Помечено в качестве ответа Abolmasov Dmitry 24 октября 2012 г. 11:35
    17 октября 2012 г. 20:03
  • Привет, спасибо что поделились решением. Но чем оно отличается от того, что вы приводили в самом вопросе, кроме того что порт по умолчанию считается открытым?)

    Для связи [mail]

    18 октября 2012 г. 6:59
  • Кажется этим и отличается :) Если попытаемся подключится на открытый порт, то событие MessageReceived не наступит, а следовательно, не возникнет исключение, при котором статус порта ставится в false.

    ЗЫ: даже если вдруг сервер что то ответит и событие наступит, то статус порта все равно останется открытым.

    ЗЗЫ: если вызвать этот метод в цикле больше двух раз подряд, то в дальнейшем все порты отображаются как открытые, пока пытаюсь понять из-за чего.


    DreamSpark Premium User


    18 октября 2012 г. 9:14