informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_sockets
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_sockets [2024/11/11 16:05] – tempwin | informatica:programacion:cursos:python_avanzado_proyectos_seguridad:introduccion_sockets [2024/11/18 08:28] (actual) – [Módulo socket en Python] tempwin | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| ====== Introducción a los sockets ====== | ====== Introducción a los sockets ====== | ||
| + | <WRAP center round box 80%> | ||
| Módulo perteneciente al curso [[informatica: | Módulo perteneciente al curso [[informatica: | ||
| + | </ | ||
| Los sockets son el componente principal que nos permite aprovechar las capacidades del sistema operativo para interactuar con la red. Puede pensar en los sockets como un canal de comunicación punto a punto entre un cliente y un servidor. | Los sockets son el componente principal que nos permite aprovechar las capacidades del sistema operativo para interactuar con la red. Puede pensar en los sockets como un canal de comunicación punto a punto entre un cliente y un servidor. | ||
| - | Los sockets de red son una manera fácil de establecer una comunicación entre procesos que están en la misma máquina o en máquinas diferentes. El concepto de un socket es muy similar al de los descriptores de archivos UNIX. Los comandos como read() y write() que nos permiten trabajar con el sistema de archivos, funcionan de manera similar a los sockets. Una dirección de socket de red consta de una dirección IP y un número de puerto. El objetivo de un socket es comunicar procesos a través de la red. | + | Los sockets de red son una manera fácil de establecer una comunicación entre procesos que están en la misma máquina o en máquinas diferentes. El concepto de un socket es muy similar al de los descriptores de archivos UNIX. Los comandos como '' |
| <WRAP center round info 60%> | <WRAP center round info 60%> | ||
| Línea 25: | Línea 27: | ||
| Estos argumentos representan las familias de direcciones y el protocolo de la capa de transporte. Dependiendo del tipo de socket, los sockets se clasifican en sockets de flujo ('' | Estos argumentos representan las familias de direcciones y el protocolo de la capa de transporte. Dependiendo del tipo de socket, los sockets se clasifican en sockets de flujo ('' | ||
| - | Los sockets también se pueden clasificar según la familia. Tenemos sockets UNIX (socket.AF_UNIX) que se crearon antes de la concepción de las redes y se basan en ficheros, sockets socket.AF_INET que son los que nos interesan, sockets socket.AF_INET6 para IPv6, etc. | + | Los sockets también se pueden clasificar según la familia. Tenemos sockets UNIX ('' |
| En la siguiente imagen vemos el constructor de la clase socket: | En la siguiente imagen vemos el constructor de la clase socket: | ||
| - | <WRAP center round important 60%> | + | {{ : |
| - | IMAAAAAAAAAAAAAAAAAAAAGEN | + | |
| - | </ | + | |
| ===== Módulo socket en Python ===== | ===== Módulo socket en Python ===== | ||
| Línea 47: | Línea 47: | ||
| </ | </ | ||
| - | <WRAP center round important 60%> | + | {{ : |
| - | IMAAAAAAAAAAAAAAAAAAAAAAAAAGEN | + | |
| - | </ | + | |
| En esta imagen vemos todas las constantes y métodos que tenemos disponibles en este módulo. Las constantes las vemos en primera instancia dentro de la estructura que ha devuelto el objeto. Entre las constantes más utilizadas podemos destacar: | En esta imagen vemos todas las constantes y métodos que tenemos disponibles en este módulo. Las constantes las vemos en primera instancia dentro de la estructura que ha devuelto el objeto. Entre las constantes más utilizadas podemos destacar: | ||
| Línea 58: | Línea 56: | ||
| Para abrir un socket en una determinada máquina utilizamos el constructor de la clase socket que acepta por parámetros la familia, el tipo de socket y el protocolo. Una llamada típica para construir un socket que funcione a nivel TCP& | Para abrir un socket en una determinada máquina utilizamos el constructor de la clase socket que acepta por parámetros la familia, el tipo de socket y el protocolo. Una llamada típica para construir un socket que funcione a nivel TCP& | ||
| - | <WRAP center round important 60%> | + | {{ : |
| - | IMAAAAAAAAAAAAAAAAAAAAAAAGEN | + | |
| - | </ | + | |
| <code python> | <code python> | ||
| Socket.socket(socket.AF_INET, | Socket.socket(socket.AF_INET, | ||
| </ | </ | ||
| - | |||
| - | ===== Recopilación de información con sockets ===== | ||
| - | |||
| - | Los métodos útiles para recopilar más información son: | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | Podemos obtener más información sobre estos métodos con el comando de '' | ||
| - | |||
| - | <WRAP center round todo 60%> | ||
| - | IMAAAAAAAAAAAAAAAAAAAAAAAAGEN | ||
| - | </ | ||
| - | |||
| - | Ahora vamos a detallar algunos métodos relacionados con el host, la dirección IP y la resolución del dominio. Para cada uno, mostraremos un ejemplo simple: | ||
| - | |||
| - | ==== socket.gethostbyname(hostname) ==== | ||
| - | |||
| - | Este método convierte un nombre de host al formato de dirección IPv4. La dirección IPv4 se devuelve en forma de cadena. Este método es equivalente al comando '' | ||
| - | |||
| - | <code python> | ||
| - | >>> | ||
| - | >>> | ||
| - | |||
| - | ' | ||
| - | |||
| - | >>> | ||
| - | |||
| - | ' | ||
| - | </ | ||
| - | |||
| - | ==== socket.gethostbyname_ex(nombre) ==== | ||
| - | |||
| - | Este método devuelve muchas direcciones IP para un solo nombre de dominio. Significa que un dominio se ejecuta en múltiples IP | ||
| - | |||
| - | <code python> | ||
| - | >>> | ||
| - | |||
| - | (' | ||
| - | |||
| - | >>> | ||
| - | |||
| - | (' | ||
| - | </ | ||
| - | |||
| - | <WRAP center round info 60%> | ||
| - | Un **dominio** es un sistema de denominación servidores en Internet el cual está formado por un conjunto de caracteres que identifica un sitio de la red accesible por un usuario. Cada dominio es administrado por un servidor de dominios (DNS). Los más comunes son .com, .edu, .net, .org y .es | ||
| - | </ | ||
| - | |||
| - | |||
| - | Otro de los métodos que disponemos en la clase sockets es el que permite obtener el nombre cualificado de un dominio: | ||
| - | |||
| - | <code python> | ||
| - | >>> | ||
| - | </ | ||
| - | |||
| - | ==== socket.gethostbyaddr(ip_address) ==== | ||
| - | |||
| - | Este método devuelve una tupla (hostname, nombre, ip_address_list) donde hostname es el nombre de host que responde a la dirección IP dada, el nombre es una lista de nombres asociados con la misma dirección& | ||
| - | |||
| - | <code python> | ||
| - | >>> | ||
| - | |||
| - | (' | ||
| - | </ | ||
| - | |||
| - | ==== socket.getservbyname(servicename [, | ||
| - | |||
| - | Este método le permite obtener el número de puerto del nombre del puerto: | ||
| - | |||
| - | <code python> | ||
| - | >>> | ||
| - | >>> | ||
| - | |||
| - | 80 | ||
| - | |||
| - | >>> | ||
| - | |||
| - | 25 | ||
| - | </ | ||
| - | |||
| - | ==== socket.getservbyport(puerto [, nombre_protocolo]) ==== | ||
| - | |||
| - | Este método realiza la operación inversa de la anterior, lo que le permite obtener el nombre del puerto a partir del número de puerto: | ||
| - | |||
| - | <code python> | ||
| - | >>> | ||
| - | |||
| - | ' | ||
| - | |||
| - | >>> | ||
| - | |||
| - | ' | ||
| - | </ | ||
| - | |||
| - | ===== Ejemplo para los métodos de socket ===== | ||
| - | |||
| - | El siguiente script es un ejemplo de cómo podemos usar estos métodos para obtener información de los servidores de Google. | ||
| - | |||
| - | Puede encontrar el siguiente código en el archivo '' | ||
| - | |||
| - | <code python> | ||
| - | # -*- encoding: utf-8 -*- | ||
| - | |||
| - | import socket | ||
| - | import sys | ||
| - | |||
| - | try: | ||
| - | print(" | ||
| - | print(socket.gethostbyname_ex(' | ||
| - | print(" | ||
| - | print(socket.gethostbyaddr(' | ||
| - | print(" | ||
| - | print(socket.getfqdn(' | ||
| - | |||
| - | except socket.error as error: | ||
| - | print (str(error)) | ||
| - | print (" | ||
| - | sys.exit() | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | |||
| - | ===== Búsqueda inversa ===== | ||
| - | |||
| - | Este comando obtiene el nombre de host de la dirección IP. Para esta tarea, podemos usar la función '' | ||
| - | |||
| - | En este script, obtenemos el nombre de host de la dirección IP de '' | ||
| - | |||
| - | Puede encontrar el siguiente código en el archivo '' | ||
| - | |||
| - | <code python> | ||
| - | # | ||
| - | # --*-- coding: UTF-8 --*-- | ||
| - | |||
| - | import sys, socket | ||
| - | try : | ||
| - | result=socket.gethostbyaddr(" | ||
| - | print(" | ||
| - | print(" | ||
| - | print(" | ||
| - | for item in result[2]: | ||
| - | print(" | ||
| - | except socket.herror as e: | ||
| - | print(" | ||
| - | </ | ||
| - | |||
| - | ===== Actividad práctica ===== | ||
| - | |||
| - | **Dado un nombre de dominio introducido por la entrada estándar por parte del usuario, obtener información relación con dicho dominio como dirección IP, host asociado y nombre cualificado del dominio.** | ||
| - | |||
| - | <code python> | ||
| - | import socket | ||
| - | |||
| - | dominio = input() | ||
| - | |||
| - | try: | ||
| - | print(" | ||
| - | ip = socket.xxx(xxx) | ||
| - | print(ip) | ||
| - | print(" | ||
| - | print(socket.xxx(str(ip))) | ||
| - | print(" | ||
| - | print(socket.xxx(dominio)) | ||
| - | |||
| - | except socket.error as error: | ||
| - | print (str(error)) | ||
| - | print (" | ||
| - | </ | ||
| - | |||
| - | **Completar el script anterior sustituyendo las '' | ||
| - | |||
| - | Solución: | ||
| - | |||
| - | <code python> | ||
| - | import socket | ||
| - | |||
| - | dominio = input() | ||
| - | |||
| - | try: | ||
| - | print(" | ||
| - | ip = socket.gethostbyname(dominio) | ||
| - | print(ip) | ||
| - | print(" | ||
| - | print(socket.gethostbyaddr(str(ip))) | ||
| - | print(" | ||
| - | print(socket.getfqdn(dominio)) | ||
| - | |||
| - | except socket.error as error: | ||
| - | print (str(error)) | ||
| - | print (" | ||
| - | </ | ||
| - | |||
| - | |||
| ===== Recursos ===== | ===== Recursos ===== | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
informatica/programacion/cursos/python_avanzado_proyectos_seguridad/introduccion_sockets.1731337535.txt.gz · Última modificación: por tempwin
