Как получить имя и IP-адрес маршрутизатора, как показано на вкладке «Сеть» Windows?(в коде) - PullRequest
1 голос
/ 01 октября 2010

По сути, если вы перейдете в «Пуск» и нажмите «Компьютер», а затем щелкните ссылку «Сеть» с левой стороны, вы увидите справа несколько категорий, одна из которых называется «Инфраструктура сети».категория, мой маршрутизатор указан, и в моем случае это "LINKSYS WAG160N Wireless-N ADSL2+ Gateway", и когда вы щелкаете правой кнопкой мыши и выбираете свойства, в нем перечисляется основная информация, такая как внутренний / шлюз IP-адрес, по моему это "192.168.1.1"

Я хотел бы знать, как получить эту информацию в коде, предпочтительно в Windows API, чтобы я мог вызывать ее с помощью устаревшего приложения VB6.Кроме того, даже если вы просто знаете версию .NET или Delphi, пожалуйста, перечислите ее, а я могу написать код на обоих.Тем не менее, ответ, который я в конечном итоге ищу, - это метод доступа к нему через VB6, так что, вероятно, это будет вызов WinAPI (вызовет ответ и выберет его в качестве ответа), однако, другие методы также приветствуются, если я не могу найти наследиеметод (я буду голосовать за них).

спасибо, ребята:)

Ответы [ 5 ]

1 голос
/ 18 октября 2018
if (!NetworkInterface.GetIsNetworkAvailable())
    return "Not connected.";

var networkDevices = NetworkInterface.GetAllNetworkInterfaces();
if (networkDevices.Length == 0)
    return "No network devices.";

networkDevices = networkDevices
    .Where(n => n.OperationalStatus == OperationalStatus.Up
        || n.OperationalStatus == OperationalStatus.Dormant)
    .ToArray();
if (networkDevices.Length == 0)
    return "Network not connected.";

networkDevices = networkDevices
    .Where(n => n.Supports(NetworkInterfaceComponent.IPv4))
    .ToArray();
if (networkDevices.Length == 0)
    return "No IPv4 network found.";

var router = networkDevices.First().GetIPProperties()
    .GatewayAddresses.First();

var routerIp = router.Address.ToString();
1 голос
/ 02 октября 2010

Вы можете попытаться перехватить выходные данные команды "route print -4" и проанализировать ее для маршрута по умолчанию.Если вы используете IPv6, измените -4 на -6.

1 голос
/ 02 октября 2010

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

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

Пример ниже написан так, чтобы он мог компилироваться как в Win XP, так и в более поздних версиях Windows. В версии библиотеки для Win XP отсутствует критическая информация о typelib, которая не позволяет VB6 использовать все, что она предлагает. Это было исправлено в Vista, однако для этого приложения нам не нужны все возможности обратного вызова, которые он предлагает. Вы можете использовать внешнюю библиотеку типов, если вам нужен полный доступ, или вы можете скомпилировать в Vista или более поздней версии. Программа, скомпилированная на Vista, отлично работает на XP.

Приведенный ниже код извлечен из более крупного класса I, используемого для сопоставления портов UPnP NAT на серверах VB6. Это подмножество может делать то, что вам нужно.

UPnPNAT.cls

Option Explicit
'Requires reference to:
'
'   UPnP 1.0 Type Library (Control Point)
'

Private Const CONN_SVCTYPEID_URI As String = "urn:schemas-upnp-org:service:WANIPConnection:1"
Private Const CONN_ID_URI As String = "urn:upnp-org:serviceId:WANIPConn1"

Private UDFinder As UPNPLib.UPnPDeviceFinder
Private WithEvents UNCBs As UPnPNATCBs
Private findData As Long
Private blnSuccess As Boolean

Public Event Result(ByVal Success As Boolean, ByVal FriendlyName As String, ByVal IP As String)

Public Sub Fetch()
    blnSuccess = False
    Set UDFinder = New UPNPLib.UPnPDeviceFinder
    Set UNCBs = New UPnPNATCBs
    findData = CallByName(UDFinder, "CreateAsyncFind", VbMethod, CONN_SVCTYPEID_URI, 0, UNCBs)
    UDFinder.StartAsyncFind findData
End Sub

Private Sub UNCBs_DeviceAdded(ByVal Device As UPNPLib.IUPnPDevice)
    Dim Services As UPNPLib.UPnPServices
    Dim Service As UPNPLib.UPnPService
    Dim varInActionArgs, varOutActionArgs
    Dim strFriendlyName As String
    Dim strIP As String

    strFriendlyName = Device.FriendlyName
    On Error Resume Next
    Set Services = Device.Services
    If Err.Number = 0 Then
        On Error GoTo 0
        With Services
            If .Count > 0 Then
                On Error Resume Next
                Set Service = .Item(CONN_ID_URI)
                If Err.Number = 0 Then
                    On Error GoTo 0
                    ReDim varInActionArgs(0 To 0)
                    ReDim varOutActionArgs(0 To 0)
                    Service.InvokeAction "GetExternalIPAddress", _
                                         varInActionArgs, _
                                         varOutActionArgs
                    strIP = varOutActionArgs(0)
                    blnSuccess = True
                Else
                    On Error GoTo 0
                End If
            End If
        End With
    Else
        On Error GoTo 0
    End If

    UDFinder.CancelAsyncFind findData
    RaiseEvent Result(blnSuccess, strFriendlyName, strIP)
    Set UDFinder = Nothing
    Set UNCBs = Nothing
End Sub

Private Sub UNCBs_SearchComplete()
    If Not blnSuccess Then
        RaiseEvent Result(False, "", "")
    End If
End Sub

UPnPNATCBs.cls

Option Explicit

Public Event DeviceAdded(ByVal Device As UPNPLib.IUPnPDevice)
Public Event DeviceRemoved(ByVal UDN As String)
Public Event SearchComplete()

Public Sub IDispatchCallback( _
    ByVal pDevice As Variant, _
    ByVal bstrUDN As Variant, _
    ByVal lType As Variant)
    'NOTE: Must be dispID = 0, i.e. the default method of the class.

    Select Case lType
        Case 0
            RaiseEvent DeviceAdded(pDevice)
        Case 1
            RaiseEvent DeviceRemoved(bstrUDN)
        Case 2
            RaiseEvent SearchComplete
    End Select
End Sub

Form1.frm

Option Explicit

Private WithEvents UN As UPnPNAT

Private Sub Form_Load()
    Set UN = New UPnPNAT
    lblStatus.Caption = "Searching..."
    UN.Fetch
End Sub

Private Sub UN_Result(ByVal Success As Boolean, ByVal FriendlyName As String, ByVal IP As String)
    If Success Then
        lblStatus.Caption = FriendlyName & " " & IP
    Else
        lblStatus.Caption = "Failed"
    End If
End Sub

Возможно, вам придется настроить это, если у вас есть несколько устройств UPnP, обеспечивающих соединения в вашей сети.

0 голосов
/ 27 июня 2017

подключиться к веб-странице http: [ip]. Заголовок этой веб-страницы как название устройства (модель устройства). Это работает с устройствами, которые отображают страницу входа. Если устройство хочет получить имя пользователя и пароль в запросе, возникает WebException, и вы можете прочитать WebException.Response.Headers ["WWW-Authenticate"], который содержит строку: Basic realm = "X", где X - строка, которая описывает устройство.

        private string GetDeviceName(string ip)
    {
        WebClient myWebClient = new WebClient(1000);
        try
        {
            System.IO.Stream s = myWebClient.OpenRead("http://" + ip);
            var sr = new System.IO.StreamReader(s);
            while (!sr.EndOfStream)
            {
                var L = sr.ReadLine();
                var sb = new StringBuilder();
                var st = 0;
                var end = 0;
                if ((st = L.ToLower().IndexOf("<title>")) != -1)
                {
                    sb.Append(L);
                    while ((end = L.ToLower().IndexOf("</title>")) == -1)
                    {
                        L = sr.ReadLine();
                        sb.Append(L);
                    }
                    sr.Close();
                    s.Close();
                    myWebClient.Dispose();
                    var title = sb.ToString().Substring(st + 7, end - st - 7);
                    Regex r = new Regex("&#[^;]+;");
                    title = r.Replace(title, delegate (Match match)
                    {
                        string value = match.Value.ToString().Replace("&#", "").Replace(";", "");
                        int asciiCode;
                        if (int.TryParse(value, out asciiCode))
                            return Convert.ToChar(asciiCode).ToString();
                        else
                            return value;
                    });
                    return $"Router/AP ({title})";
                }
            }
            sr.Close();
            s.Close();
            myWebClient.Dispose();
        }
        catch (System.Net.WebException ex)
        {
            var response = ex.Response as HttpWebResponse;
            if (response == null)
                return "";

            var name = response.Headers?["WWW-Authenticate"]?.Substring(12).Trim('"');
            myWebClient.Dispose();
            return name;
        }
        return "";
    }
0 голосов
/ 01 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...