Arhn - архитектура программирования

Как получить IP-адрес маршрутизатора в Swift iOS

Я хочу получить IP-адрес подключенного маршрутизатора с моего iPhone. Я получаю только IP-адрес своего iPhone.

Есть ли способ получить IP-адрес хоста/маршрутизатора?

Кстати, я уже просмотрел следующие ссылки, но там нет решений:

  1. Как быстро получить IP-адрес
  2. Как получить IP-адрес локального имени хоста в локальной сети в Swift
  3. Swift — получение IP-адреса WIFI устройства

Я пытаюсь сделать это в Swift 5 с XCode 12.4.


  • вам нужно вызвать внешний API, получить общедоступный и IP-адрес маршрутизатора 26.05.2021
  • @ Anbu.Karthik, не могли бы вы объяснить, какой внешний API я должен вызывать? Нужно ли создавать их отдельно? 27.05.2021
  • Вы должны проверить stackoverflow.com/questions/58503680/ 27.05.2021

Ответы:


1

Вы можете получить IP-адрес вашего шлюза по умолчанию из таблицы маршрутизации, используя sysctl, но сначала вы должны определить необходимые структуры и константы, поскольку Darwin.net.route или <route.h> не доступны для iOS SDK:

let RTAX_GATEWAY = 1
let RTAX_MAX = 8

public struct rt_metrics {
    public var rmx_locks: UInt32 /* Kernel leaves these values alone */
    public var rmx_mtu: UInt32 /* MTU for this path */
    public var rmx_hopcount: UInt32 /* max hops expected */
    public var rmx_expire: Int32 /* lifetime for route, e.g. redirect */
    public var rmx_recvpipe: UInt32 /* inbound delay-bandwidth product */
    public var rmx_sendpipe: UInt32 /* outbound delay-bandwidth product */
    public var rmx_ssthresh: UInt32 /* outbound gateway buffer limit */
    public var rmx_rtt: UInt32 /* estimated round trip time */
    public var rmx_rttvar: UInt32 /* estimated rtt variance */
    public var rmx_pksent: UInt32 /* packets sent using this route */
    public var rmx_state: UInt32 /* route state */
    public var rmx_filler: (UInt32, UInt32, UInt32) /* will be used for TCP's peer-MSS cache */
}

public struct rt_msghdr2 {
    public var rtm_msglen: u_short /* to skip over non-understood messages */
    public var rtm_version: u_char /* future binary compatibility */
    public var rtm_type: u_char /* message type */
    public var rtm_index: u_short /* index for associated ifp */
    public var rtm_flags: Int32 /* flags, incl. kern & message, e.g. DONE */
    public var rtm_addrs: Int32 /* bitmask identifying sockaddrs in msg */
    public var rtm_refcnt: Int32 /* reference count */
    public var rtm_parentflags: Int32 /* flags of the parent route */
    public var rtm_reserved: Int32 /* reserved field set to 0 */
    public var rtm_use: Int32 /* from rtentry */
    public var rtm_inits: UInt32 /* which metrics we are initializing */
    public var rtm_rmx: rt_metrics /* metrics themselves */
}

public func getDefaultGateway() -> String? {
    var name: [Int32] = [
        CTL_NET,
        PF_ROUTE,
        0,
        0,
        NET_RT_DUMP2,
        0
    ]
    let nameSize = u_int(name.count)
    
    var bufferSize = 0
    sysctl(&name, nameSize, nil, &bufferSize, nil, 0)
    
    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
    defer { buffer.deallocate() }
    buffer.initialize(repeating: 0, count: bufferSize)
    
    guard sysctl(&name, nameSize, buffer, &bufferSize, nil, 0) == 0 else { return nil }
    
    // Routes
    var rt = buffer
    let end = rt.advanced(by: bufferSize)
    while rt < end {
        let msg = rt.withMemoryRebound(to: rt_msghdr2.self, capacity: 1) { $0.pointee }
        
        // Addresses
        var addr = rt.advanced(by: MemoryLayout<rt_msghdr2>.stride)
        for i in 0..<RTAX_MAX {
            if (msg.rtm_addrs & (1 << i)) != 0 && i == RTAX_GATEWAY {
                let si = addr.withMemoryRebound(to: sockaddr_in.self, capacity: 1) { $0.pointee }
                if si.sin_addr.s_addr == INADDR_ANY {
                    return "default"
                }
                else {
                    return String(cString: inet_ntoa(si.sin_addr), encoding: .ascii)
                }
            }
            
            let sa = addr.withMemoryRebound(to: sockaddr.self, capacity: 1) { $0.pointee }
            addr = addr.advanced(by: Int(sa.sa_len))
        }
        
        rt = rt.advanced(by: Int(msg.rtm_msglen))
    }
    
    return nil
}

// How to use
if let ip = getDefaultGateway() {
    print(ip)
}
// Prints: 192.168.1.1


31.05.2021
  • Можем ли мы получить IP-адрес подключенной точки доступа в iOS, если шлюз 0.0.0.0? 02.06.2021
  • Мы попробовали этот код и получили IP-адрес шлюза подключенной точки доступа, в моем случае это 0.0.0.0. Но нам нужен IP-адрес подключенной точки доступа, а не IP-адрес шлюза. Не могли бы вы помочь? 04.06.2021
  • Как я могу получить IP-адрес DHCP-сервера iOS Swift? 07.06.2021
  • @Akshada-Systematix Мой пример показывает, как вы можете получить доступ к своей таблице маршрутизации и получить информацию о шлюзе по умолчанию. В таблице маршрутизации есть все известные маршруты, такие как хост, подсеть и по умолчанию, и вы можете получить нужный маршрут из списка, проанализировав его флаги. Шлюзы и маршруты FreeBSD — docs.freebsd.org/en/ книги/руководство/расширенная сеть/ 07.06.2021
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..