1

Тема: Як отримати IP в локальній мережі?

Добрий день.
Мені потрібно отримати IP пристрою в локальній мережі.
В мене декілька мережевих адаптерів.

Я нагуглив це:

import socket

def get_ip():
    return socket.gethostbyname(socket.gethostname())

Функція get_ip повертає IP мережевого адаптера eth0, а мені потрібно wifi0.

Підкажіть будь ласка, як це зробити?

Подякували: leofun011

2

Re: Як отримати IP в локальній мережі?

import socket
def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(('10.255.255.255', 1))
        IP = s.getsockname()[0]
    except:
        IP = 'N/A'
    finally:
        s.close()
    return IP

print(get_ip())

3

Re: Як отримати IP в локальній мережі?

ITrobot написав:

Добрий день.
Мені потрібно отримати IP пристрою в локальній мережі.
В мене декілька мережевих адаптерів.

Я нагуглив це:

import socket

def get_ip():
    return socket.gethostbyname(socket.gethostname())

Функція get_ip повертає IP мережевого адаптера eth0, а мені потрібно wifi0.

Підкажіть будь ласка, як це зробити?

спочатку отримайте перелік інтерфейсів, наприклад за допомогою os.listdir('/sys/class/net/')
потім для кожного інтерфейсу вже адресу наприклад за допомогою fcntl.ioctl

4

Re: Як отримати IP в локальній мережі?

frz написав:
import socket
def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(('10.255.255.255', 1))
        IP = s.getsockname()[0]
    except:
        IP = 'N/A'
    finally:
        s.close()
    return IP

print(get_ip())

Це рішення ЗОВСІМ не підходить.

Для цього треба, щоб був запущений сервер і знати IP цього сервера. Як дізнатись IP цього сервера? Треба, щоб був запущений сервер і знати IP цього сервера. А щоб відправити IP сервера на початковий пристрій, треба знати IP цього пристрою.

5

Re: Як отримати IP в локальній мережі?

HetmanNet написав:
ITrobot написав:

Добрий день.
Мені потрібно отримати IP пристрою в локальній мережі.
В мене декілька мережевих адаптерів.

Я нагуглив це:

import socket

def get_ip():
    return socket.gethostbyname(socket.gethostname())

Функція get_ip повертає IP мережевого адаптера eth0, а мені потрібно wifi0.

Підкажіть будь ласка, як це зробити?

спочатку отримайте перелік інтерфейсів, наприклад за допомогою os.listdir('/sys/class/net/')
потім для кожного інтерфейсу вже адресу наприклад за допомогою fcntl.ioctl

Дякую за підказку, як отримати перелік інтерфейсів в Linux, але це не допоможе мені отримати IP з потрібного.
Я не знаю, що таке fcntl і ioctl. З документації python дізнався, що це щось, пов'язане з файловою системою Unix. Мені потрібне більш кросплатформне і високорівневе рішення. Тому я пишу цю програму на Python, а не на C.

6

Re: Як отримати IP в локальній мережі?

from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
    addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
    if 'wlo' in ifaceName:
        print (ifaceName + '\n', ''.join(addresses))

7

Re: Як отримати IP в локальній мережі?

socket.gethostbyaddr(ip_address)
Return a triple (hostname, aliaslist, ipaddrlist) where hostname is the primary host name responding to the given ip_address, aliaslist is a (possibly empty) list of alternative host names for the same address, and ipaddrlist is a list of IPv4/v6 addresses for the same interface on the same host (most likely containing only a single address). To find the fully qualified domain name, use the function getfqdn(). gethostbyaddr() supports both IPv4 and IPv6.

>>> import socket
>>> socket.gethostbyaddr('10.10.10.13')
# ('IdeaCentre', [], ['10.10.10.13'])
>>> socket.gethostbyaddr('10.10.10.10')
# ('_gateway', [], ['10.10.10.10'])
>>> socket.gethostbyaddr('1.1.1.1')
# ('one.one.one.one', [], ['1.1.1.1'])
>>> socket.gethostbyaddr('8.8.8.8')
# ('dns.google', [], ['8.8.8.8'])
>>> socket.gethostbyaddr('64.233.165.113')
# ('lg-in-f113.1e100.net', [], ['64.233.165.113'])

8 Востаннє редагувалося HetmanNet (15.06.2022 13:00:36)

Re: Як отримати IP в локальній мережі?

ITrobot написав:

Мені потрібне більш кросплатформне і високорівневе рішення.

Тут варіанти:
1. робити реалізацію під кожну платформу та обирати відповідно до тієї на якій запущено
2. шукати готову бібліотеку чи фреймворк яка має реалізацію під всі платформи

9

Re: Як отримати IP в локальній мережі?

хай почитає документацію на socket, якщо там тої функції нема то сам по коду побачить що функція бере по замовчуванню хост

10

Re: Як отримати IP в локальній мережі?

reverse2500 написав:

socket.gethostbyaddr(ip_address)
Return a triple (hostname, aliaslist, ipaddrlist) where hostname is the primary host name responding to the given ip_address, aliaslist is a (possibly empty) list of alternative host names for the same address, and ipaddrlist is a list of IPv4/v6 addresses for the same interface on the same host (most likely containing only a single address). To find the fully qualified domain name, use the function getfqdn(). gethostbyaddr() supports both IPv4 and IPv6.

>>> import socket
>>> socket.gethostbyaddr('10.10.10.13')
# ('IdeaCentre', [], ['10.10.10.13'])
>>> socket.gethostbyaddr('10.10.10.10')
# ('_gateway', [], ['10.10.10.10'])
>>> socket.gethostbyaddr('1.1.1.1')
# ('one.one.one.one', [], ['1.1.1.1'])
>>> socket.gethostbyaddr('8.8.8.8')
# ('dns.google', [], ['8.8.8.8'])
>>> socket.gethostbyaddr('64.233.165.113')
# ('lg-in-f113.1e100.net', [], ['64.233.165.113'])

Мені потрібно отримати саме той addr.
В локальній мережі.
192.168.*.*
10.*.*.*

11

Re: Як отримати IP в локальній мережі?

ITrobot написав:

Для цього треба, щоб був запущений сервер і знати IP цього сервера. Як дізнатись IP цього сервера? Треба, щоб був запущений сервер і знати IP цього сервера. А щоб відправити IP сервера на початковий пристрій, треба знати IP цього пристрою.

Можна відправити броадкаст повідомлення, на яке відповість сервер. Або використати готовий протокол, який це зробить, наприклад UPnP або Bonjour. Якщо власник сервера має адмінські права в мережі, і може налаштовувати DNS, то клієнт може запитати в dns сервака список SRV записів.

Подякували: leofun011

12

Re: Як отримати IP в локальній мережі?

frz написав:
from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
    addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
    if 'wlo' in ifaceName:
        print (ifaceName + '\n', ''.join(addresses))

Дякую. Я вже пробував netifaces, але не працювало.

13

Re: Як отримати IP в локальній мережі?

Torbins написав:
ITrobot написав:

Для цього треба, щоб був запущений сервер і знати IP цього сервера. Як дізнатись IP цього сервера? Треба, щоб був запущений сервер і знати IP цього сервера. А щоб відправити IP сервера на початковий пристрій, треба знати IP цього пристрою.

Можна відправити броадкаст повідомлення, на яке відповість сервер. Або використати готовий протокол, який це зробить, наприклад UPnP або Bonjour. Якщо власник сервера має адмінські права в мережі, і може налаштовувати DNS, то клієнт може запитати в dns сервака список SRV записів.

Мені треба універсальне рішення. Без серверів, адмінських прав, і спеціальний протоколів. Я пишу софт для звичайних користувачів. Не для програмістів і сисадмінів. І зовсім не розбираюсь в мережах.

14

Re: Як отримати IP в локальній мережі?

ITrobot написав:
frz написав:
from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
    addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
    if 'wlo' in ifaceName:
        print (ifaceName + '\n', ''.join(addresses))

Дякую. Я вже пробував netifaces, але не працювало.

Ні, не працює.
На лінуксі все добре, але для windows не підходить.

15

Re: Як отримати IP в локальній мережі?

ITrobot написав:

На лінуксі все добре, але для windows не підходить.

Те, що і казав, вам треба робити кілька рішень які обираєте відносно ОС на якій запущені.

16

Re: Як отримати IP в локальній мережі?

Якщо не вистачає мізків розібратись з броадкаст повідомленнями, то доведеться використовувати готовий код: https://pypi.org/project/ssdp-upnp/