tutorialspoint socket gui español book python networking

gui - socket python 3 español



Lista de direcciones IP/nombres de host de la red local en Python (7)

¿Cómo puedo obtener fácilmente una lista de direcciones IP o nombres de host de una red local en Python?

Sería mejor si fuera multiplataforma, pero primero tiene que funcionar en Mac OS X, luego otros siguen.

Editar: por local me refiero a todas las direcciones activas dentro de una red local, como 192.168.xxx.xxx .

Entonces, si la dirección IP de mi computadora (dentro de la red local) es 192.168.1.1 , y tengo otras tres computadoras conectadas, me gustaría que devuelva las direcciones IP 192.168.1.2 , 192.168.1.3 , 192.168.1.4 y posiblemente sus nombres de host.


Aquí hay un pequeño escáner de herramientas que lo ayudará a obtener todas las direcciones IP y sus direcciones MAC correspondientes en la red (Funciona en Linux). Este es el enlace para scanip (Ip y Mac scanner) escrito en python. https://pypi.python.org/pypi/scanip/1.0

También puede descargarlo usando pip install scanip en Linux y para usarlo, crear un archivo de prueba en python y usarlo así:

import scanip.scanip scanip.scanip.start_scan()

y ejecuta este programa Toda la ip y sus direcciones MAC correspondientes en la LAN se mostrarán en la terminal.


He recopilado la siguiente funcionalidad de algunos otros hilos y funciona para mí en Ubuntu.

import os import socket import multiprocessing import subprocess import os def pinger(job_q, results_q): """ Do Ping :param job_q: :param results_q: :return: """ DEVNULL = open(os.devnull, ''w'') while True: ip = job_q.get() if ip is None: break try: subprocess.check_call([''ping'', ''-c1'', ip], stdout=DEVNULL) results_q.put(ip) except: pass def get_my_ip(): """ Find my IP address :return: """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) ip = s.getsockname()[0] s.close() return ip def map_network(pool_size=255): """ Maps the network :param pool_size: amount of parallel ping processes :return: list of valid ip addresses """ ip_list = list() # get my IP and compose a base like 192.168.1.xxx ip_parts = get_my_ip().split(''.'') base_ip = ip_parts[0] + ''.'' + ip_parts[1] + ''.'' + ip_parts[2] + ''.'' # prepare the jobs queue jobs = multiprocessing.Queue() results = multiprocessing.Queue() pool = [multiprocessing.Process(target=pinger, args=(jobs, results)) for i in range(pool_size)] for p in pool: p.start() # cue hte ping processes for i in range(1, 255): jobs.put(base_ip + ''{0}''.format(i)) for p in pool: jobs.put(None) for p in pool: p.join() # collect he results while not results.empty(): ip = results.get() ip_list.append(ip) return ip_list if __name__ == ''__main__'': print(''Mapping...'') lst = map_network() print(lst)


Si conoce los nombres de sus computadoras, puede usar:

import socket IP1 = socket.gethostbyname(socket.gethostname()) # local IP adress of your computer IP2 = socket.gethostbyname(''name_of_your_computer'') # IP adress of remote computer

De lo contrario, tendrá que buscar todas las direcciones IP que siguen la misma máscara que su computadora local (IP1), como se indica en otra respuesta.


Si te refieres a "local" en el mismo segmento de red, entonces debes seguir los siguientes pasos:

  1. Determine su propia dirección IP
  2. Determine su propia máscara de red
  3. Determine el rango de la red
  4. Escanee todas las direcciones (excepto la más baja, que es su dirección de red y la más alta, que es su dirección de difusión).
  5. Use la búsqueda inversa de su DNS para determinar el nombre de host para las direcciones IP que responden a su escaneo.

O simplemente puede dejar que Python ejecute nmap de forma externa y canalice los resultados nuevamente en su programa.


Tratar:

import socket print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])


Una de las respuestas en esta pregunta podría ayudarte. Parece que hay una versión de plataforma agnóstica para Python, pero aún no lo he probado.