¿Cómo puedo arreglar mi servidor asincio de regresar [Win 10022]?
He estado escribiendo código para un servidor asincio en mi raspberry pi 4. Cuando estaba codificando al Cliente, e hice una prueba con mi clase Server, regresa:
Traceback (most recent call last):
File "C:\Users\####\Documents\rpiswr\client.py", line 23, in
asyncio.run(client_run())
File "C:\Users\####\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Users\####\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 642, in run_until_complete
return future.result()
File "C:\Users\####\Documents\rpiswr\client.py", line 18, in client_run
await client.connect(("192.168.0.11", 56500))
File "C:\Users\####\Documents\rpiswr\aserver\__init__.py", line 11, in connect
print(f"Connecting as {self.s.getsockname()}")
OSError: [WinError 10022] An invalid argument was supplied
He buscado el error, y no hay resultado sustancial. Por eso pregunto esto. Voy a enumerar mi código abajo:
init.py(en directorio aserver):
import asyncio, socket
class Client:
def __init__(self):
pass
async def connect(self, addr):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.setblocking(False)
print(f"Connecting as {self.s.getsockname()}")
self.s.connect(addr)
async def recv(self,buf_size):
data = buf_size
print(f"Recieved {data.decode()} in byte data")
async def close_conn(self):
print(f"Closed connection with server")
self.s.close()
async def send_bytes(self, data:bytes):
self.s.sendall(data)
print(f"Sent {data.decode()} in byte format")
class Server:
"""Implement handle function or decorate a function with @Server.handler()"""
def __init__(self, addr):
self.addr = addr
async def start_server(self, handler_method):
self.server = await asyncio.start_server(handler_method, self.addr[0], self.addr[1])
self.addr = self.server.sockets[0].getsockname()
print(f"Serving on {self.addr}")
async with self.server:
await self.server.serve_forever()
cliente.py(problemas ocurren aquí):
from aserver import Client
import asyncio
client = Client()
async def client_run():
await client.connect(("192.168.0.11", 56500))
await client.send_bytes(b'Hi Echo Server!')
await client.recv(1024)
await client.close_conn()
asyncio.run(client_run())
server.py( funciona perfectamente bien):
import aserver as srv
from aserver import Server
import asyncio
server = srv.Server(["192.168.0.11", 56500])
async def echo_server(reader, writer):
data = await reader.read(1024)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Recieved {message} from addr")
print(f"Echoing {message} back")
writer.write(data)
await writer.drain()
print(f"Closing connection with {addr}")
writer.close()
asyncio.run(server.start_server(echo_server))
¿Por qué ocurre este error? ¿Cómo puedo arreglar esto? Cualquier respuesta será apreciada. Me encantaría si pudieras arreglar mi código donde veas el problema.
Editar:
Respondido por @user4815162342, pero gracias a todos los demás que contribuyeron!
Pregunta hecha hace 3 años, 4 meses, 28 días - Por rubyrover
2 Respuestas:
-
El error [WinError 10022] que estás experimentando indica que se está intentando realizar una operación en un socket que no es válido en Windows. Esto podría estar ocurriendo debido a que la conexión del socket no se ha completado antes de intentar interactuar con él.
Para corregir este error, te recomendaría ajustar tu método
Client.connect
para esperar a que la conexión se complete antes de realizar cualquier operación adicional en el socket. Puedes lograr esto utilizandoawait asyncio.wait_for(s.connect(addr), timeout)
para esperar a que la conexión se complete con un tiempo de espera.Aquí te dejo una posible modificación de tu método
Client.connect
para implementar esta solución:python async def connect(self, addr): self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.setblocking(False) print(f"Connecting as {self.s.getsockname()}") try: await asyncio.wait_for(self.s.connect(addr), timeout=5) except asyncio.TimeoutError: print("Connection timeout") except Exception as e: print(f"Error connecting: {e}") if self.s.fileno() != -1: print("Connection established") else: print("Connection failed")
Con esta modificación, la conexión se espera durante 5 segundos antes de continuar con las operaciones en el socket. Esto debería evitar el error [WinError 10022].
Prueba esta modificación en tu código y verifica si te ayuda a solucionar el problema. ¡Déjame saber si tienes alguna otra duda o si necesitas más ayuda!
Respondida el Dec 20, 2020 a las 14:34 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error
[WinError 10022] An invalid argument was supplied
en Windows suele ocurrir cuando se intenta conectar a una dirección o puerto no válido.Veamos el código de tu cliente:
python await client.connect(("192.168.0.11", 56500))
Estás intentando conectarte a la dirección
192.168.0.11
y al puerto56500
. Asegúrate de que esta dirección y puerto son correctos. Verifica que el servidor se esté ejecutando en el puerto56500
en la dirección192.168.0.11
.Además, asegúrate de que no haya ningún firewall o software antivirus que esté bloqueando la conexión entre el cliente y el servidor.
Si aún tienes problemas, intenta lo siguiente:
Imprime la dirección y el puerto que obtienes de
self.s.getsockname()
en el métodoconnect
de la claseClient
. Esto te ayudará a verificar si la dirección y el puerto son válidos. Intenta conectarte a un servidor diferente (por ejemplo,google.com
) para asegurarte de que el problema no esté en tu código de cliente.- Verifica que tu servidor esté escuchando en la dirección y el puerto correctos.
Espero que esto ayude! Avísame si tienes alguna otra pregunta.
Respondida el Dec 20, 2020 a las 14:42 - por Gemini
Votos positivos: 0 | Votos negativos: 0