ICMP Ping в WinRT — возможно ли это?

Как выполнить эхо-запрос ICMP в приложении WinRT Modern UI?

В настоящее время Ping не реализован в WinRT (см. соответствующий вопрос здесь), и предыдущие стратегии в Silverlight:

  • Используйте службу WCF
  • Вызов Javascript, который затем вызывает компонент ActiveX
  • Откажитесь (здесь)

Василий здесь использует http для "пингования" веб-сервера на определенном порту с помощью StreamSocket, который поддерживает сетевая связь с использованием TCP-сокета.

Возможно, Windows.Networking.Socket — это API самого высокого уровня, который мне приходится использовать. если я хочу написать свою собственную библиотеку ICMP для WinRT..

Эта реализация использует System.Net.Sockets для выполнения эхо-запроса ICMP — в стандартном .NET

В этом образце WinRT используется Windows.Networking.Sockets.DatagramSocket класс для создания сокета UDP. Я думаю, что мне нужны необработанные сокеты для выполнения ICMP.

Возможно ли это вообще в песочнице WinRT для проверки связи ICMP?


person Dave Mateer    schedule 16.10.2012    source источник


Ответы (1)


Что-то типа:

try
            {
                using (var tcpClient = new StreamSocket())
                {
                    await tcpClient.ConnectAsync(
                        new Windows.Networking.HostName(HostName),
                        PortNumber,
                        SocketProtectionLevel.PlainSocket);

                    var localIp = tcpClient.Information.LocalAddress.DisplayName;
                    var remoteIp = tcpClient.Information.RemoteAddress.DisplayName;

                    ConnectionAttemptInformation = String.Format("Success, remote server contacted at IP address {0}",
                                                                 remoteIp);
                    tcpClient.Dispose();
                }
            }
            catch (Exception ex)
            {
                if (ex.HResult == -2147013895)
                {
                    ConnectionAttemptInformation = "Error: No such host is known";
                }
                else if (ex.HResult == -2147014836)
                {
                    ConnectionAttemptInformation = "Error: Timeout when connecting (check hostname and port)";
                }
                else
                {
                    ConnectionAttemptInformation = "Error: Exception returned from network stack: " + ex.Message;
                }
            }
            finally
            {
                ConnectionInProgress = false;
            }

полный исходный код здесь: github

person Faster Solutions    schedule 16.10.2012
comment
Спасибо - я считаю, что StreamSocket - это транспортный уровень TCP, поэтому его нельзя заставить работать для создания пингов ICMP. - person Dave Mateer; 16.10.2012
comment
вам действительно нужно использовать Ping или просто дублировать функциональность? - person Faster Solutions; 16.10.2012
comment
Да, мне нужно использовать ICMP-пинг :-) К сожалению, запрос порта 80 или 443 недостаточно хорош. - person Dave Mateer; 16.10.2012