Как получить IP Address?


#1

Привет. Подскажите, кто-нибудь сталкивался с задачей получить IP адрес устройства?
Мне нужно получить IP устр с которого юзер подключается к серверу.
Все что удалось найти - либо не работает, либо работает некорректно…
Может у кого есть решения. Буду признателен.


#2

У себя на бэкенде сделайте метод который будет отдавать ip адрес клиента. Это одна или несколько строк кода в зависимости от серверного языка. Или можете воспользоваться публичным сервисом, например https://api.ipify.org
Затем клиентом делаете к нему простой http запрос и ip у вас в ответе.


#3
  1. На чем у вас бэкенд
  2. Что вы уже пробовали

У любого языка есть метод для получения IP клиента. Не работать тут просто не может.

@id0 для чего отдавать IP клиента, если его нужно получить? И для чего публичные сервисы? Зачем лишний геморой.

P.S. и вы учтите, что телефоны не имеют своего IP адреса, они отдают IP адрес точки подключения в случае с WiFi, либо IP адрес сотовой вышки или оператора (тут не уверен).


#4

Получение ip устройства. Вдруг поможет?

class IPAddressManager {
	
	//MARK: - Public
	
	public var currentIpAddresses: String {
		let firstAddress = self.localAddresses().first(where: { (item) -> Bool in
			return NSPredicate.ipMask.evaluate(with: item)
		})
		return firstAddress ?? ""
	}
	
	//MARK: - Private
	
	private func localAddresses() -> [String] {
		var addresses = [String]()
		
		var ifaddr: UnsafeMutablePointer<ifaddrs>?
		guard getifaddrs(&ifaddr) == 0 else { return [] }
		guard let firstAddr = ifaddr else { return [] }
		
		for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
			let flags = Int32(ptr.pointee.ifa_flags)
			let addr = ptr.pointee.ifa_addr.pointee
			if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {
				if addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) {
					
					var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
					if (getnameinfo(ptr.pointee.ifa_addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST) == 0) {
						let address = String(cString: hostname)
						if address.rangeOfCharacter(from: .letters) == nil {
							addresses.append(address)
						}
					}
				}
			}
		}
		
		freeifaddrs(ifaddr)
		return addresses
	}
}

//....
print(IPAddressManager().currentIpAddresses)

#5

А теперь спрашивается зачем на телефоне получать IP адрес.
Если нужно где-то на сервере его получить, так это делается средствами самого сервера куда проще.


#6

Ну, по логике это должен делать сервер. =)


#7

По вопросу тс я понял, что ему нужен внешний ip адрес в интернете, а не в локальной сети. А встроенные методы языка отдают как раз локальный ip.
По поводу отдать/получить –– всё правильно, сервер его определяет и отдаёт клиенту, а клиент получает. Публичный сервис это так для примера, если тс не может или не хочет делать на своём сервере.


#8

Как раз-таки сервера получают внешний IP адрес.
Локальные, которые определяются только внутри сети (192.168.0…), он им не нужен.
На девайсе делать что-то такого рода - это извращение.


#9

Ну так может тс хочет показать пользователю его внешний ip адрес, о чём я изначально и подумал. Из его вопроса не очень понятно для каких целей он ему нужен, вот я и написал, что внешний ip определяется на стороне сервера, а потом его уже можно вернуть на клиент.


#10

Всем спасибо за советы, делал как написал Tau, но на выходе был IP роутера. В итоге сделал через https://api.ipify.org .


#11

А вы какой IP хотели получить? ))))))))


#12

нужен был внешний) а так получал 192.168. …


#13

хардкор, только хардкор.