OSError: [WinError 10038] se intentó una operación en algo que no es un socket

Salman Mehmood 21 junio 2023
  1. Crear una Aplicación con la Ayuda del Módulo socket Sin Error en Python
  2. el OSError: [WinError 10038] Se intentó una operación en algo que no es un socket
OSError: [WinError 10038] se intentó una operación en algo que no es un socket

Con esta explicación, aprenderemos qué es servidor y cliente y cómo usar el módulo socket para crear una aplicación con la ayuda de servidor y cliente. También aprenderemos a evitar errores al realizar este tipo de aplicaciones en Python.

Crear una Aplicación con la Ayuda del Módulo socket Sin Error en Python

En Internet, el nodo puede ser un servidor o un cliente; por supuesto, también puede ser una red de cliente a cliente donde tiene todos los nodos y se comunican entre sí. Es una red peer-to-peer.

Tenemos servidores en Internet que escuchan a los clientes y están esperando que el cliente envíe una solicitud.

Por ejemplo, cuando va a google.com, el servidor de Google, y envía una solicitud al servidor de Google, el servidor de Google le enviará alguna respuesta, es decir, una página o un mensaje de Página no encontrada.

Comencemos por crear dos archivos de Python, demo.py y client.py. Queremos enviar el mensaje del servidor al cliente.

El servidor y el cliente pueden estar en diferentes ubicaciones o fuera de la red.

Crearemos el servidor, y luego pasaremos un mensaje y veremos cómo este cliente recibe el mensaje del servidor. Para mantenerlo simple, lo estamos haciendo en el servidor local, pero también puede hacerlo en diferentes sistemas.

Lo primero que tenemos que hacer es importar el socket y crear una instancia. Llamaremos a la clase de socket y luego especificaremos la familia de socket.

La familia de sockets será AF_INET, y la fórmula del socket será SOCK_STREAM.

En el siguiente paso, necesitaremos vincular el socket al nombre de host en el puerto usando el método bind(). Ahora, tenemos que escuchar las conexiones usando el método listen(); el número máximo de conexiones sería 5.

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)

Para encontrar una conexión con un cliente, enviamos un mensaje desde el servidor para que el cliente reciba el mensaje.

Para ello utilizaremos el bucle while que sería True. En este bucle, crearemos otro socket que sería el socket del cliente utilizando el método connect(); se utilizará en el archivo client.py.

Estamos usando el método aceptar() que devuelve dos valores; por eso declaramos dos variables que almacenan el socket entrante y la dirección de la conexión entrante. Ahora, imprimiremos un mensaje que muestra que se ha establecido una conexión desde la dirección especificada.

while True:
    Client_Socket, Adress = SKT.accept()
    print(f"Connection has been established from {Adress}")

Ahora necesitaremos enviar un mensaje en bytes. La codificación será utf-8, enviada a cada cliente conectado al socket.

Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()

Nuestro socket está listo para escuchar la conexión. Ahora trabajaremos en el archivo client.py y usaremos el mismo código excepto el método connect().

En el método connect(), usaremos el mismo nombre de host, localhost y puerto.

Ahora, vamos a recibir el mensaje que viene del servidor. Usaremos el método recv() y lo pasaremos a 2048 bytes.

Imprimiremos este mensaje para verificar si el mensaje ha sido recibido o no.

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.connect((socket.gethostname(), 6060))

MSG = SKT.recv(2048)

print(f"Message has been received {MSG}")

Ahora, la aplicación está completa, por lo que ejecutaremos primero el servidor, el archivo demo.py; se está ejecutando, pero no ha pasado nada. Si vamos a client.py y ejecutamos este archivo en una ventana interactiva, podemos ver la respuesta en la consola cuando estos archivos se ejecutan simultáneamente.

Aplicación con el módulo de enchufe sin error - Salida

el OSError: [WinError 10038] Se intentó una operación en algo que no es un socket

Hay algunas razones comunes por las que recibimos errores al crear esta aplicación. Una razón podría ser que olvidó ejecutar un archivo, ambos, o que está cometiendo un error en alguna parte.

Veamos un ejemplo en el que los usuarios suelen recibir este error.

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)

while True:
    Client_Socket, Adress = SKT.accept()

    while True:

        print(f"Connection has been established from {Adress}")
        Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
        Client_Socket.close()

Producción :

OSError: [WinError 10038] An operation was attempted on something that is not a socket

Esto se debe a que estamos ejecutando un bucle while anidado, y ambos son Verdaderos. Cuando se ejecuta el bucle exterior while, aceptamos la conexión entrante del cliente.

El problema ocurre cuando se ejecuta el bucle interno while.

Dado que el bucle while interno es True la primera vez, este bucle se ejecuta perfectamente, pero en la segunda iteración, el bucle while necesita aceptar una conexión entrante. El método aceptar() llama desde el bucle exterior, que nunca será llamado; es por eso que encuentra que el socket ya no existe.

Otra razón por la que puede ocurrir el problema es cuando ejecuta estos dos archivos desde la terminal. Si está trabajando en código VS, ejecute estos dos archivos individualmente en (archivo actual en una ventana interactiva).

Aplicación con el módulo de socket - Ejecutar el archivo actual en la ventana interactiva

Complete el código del archivo demo.py:

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)

while True:
    Client_Socket, Adress = SKT.accept()
    print(f"Connection has been established from {Adress}")
    Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
    Client_Socket.close()
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Python Error