es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna posibilidad de evitar el tamaño del paquete enviado al datagrama? [Errno 10040]

Estoy tratando de crear una aplicación usando Python para ver películas juntos, pero constantemente obtengo errores con:

[Errno 10040] Se envió un mensaje en un socket de datagrama que era mayor que el búfer de mensaje interno o algún otro límite de red, o el búfer utilizado para recibir un datagrama era más pequeño que el datagrama en sí mismo

Server.py

BUFFOR_SIZE_DATA = 65536

#CONFIGURACIONES DEL SERVIDOR
server_socket_main = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket_main.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFOR_SIZE_DATA)

print(Fore.RED + 'UDP Server')
host_name = socket.gethostname()
print('HOST NAME:',host_name)
host_ip_address = ''
print('HOST IP:',host_ip_address)
host_port = 1337
socket_address_main = (host_ip_address, host_port)
print('PORT:',host_port)
server_socket_main.bind(socket_address_main)
print(Fore.GREEN + 'Server is listening >>>')
print(Fore.WHITE + ' ')
print(Fore.WHITE + 'Connected devices: ')

#VIDEO QUE DESEAS VER JUNTOS
server_video_main = cv2.VideoCapture('movies/exmpl.mp4')

#CICLO PRINCIPAL
while True:
    msg, client_address_obligatory = server_socket_main.recvfrom(BUFFOR_SIZE_DATA)
    print('Connected from', client_address_obligatory)
    WIDTH = 1024
    while(server_video_main.isOpened()):
        _,frame = server_video_main.read()
        frame = imutils.resize(frame, width=WIDTH)
        encoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
        message = base64.b64encode(buffer)
        server_socket_main.sendto(message, client_address_obligatory)
        cv2.imshow('HOST | Currently hosting', frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('c'):
            server_socket_main.close()
            break

Client.py

client_socket_main.sendto(welcomemessage.encode(), (client_ip_address, client_port))

while True:
    packet,_ = client_socket_main.recvfrom(BUFFOR_SIZE_DATA)
    data = base64.b85decode(packet, ' /')
    npdata = np.fromstring(data, dtype=np.uint8)
    frame = cv2.imdecode(npdata, 1)
    cv2.imshow('Currently watching', frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('c'):
        client_socket_main.close()
        break

data = base64.b85decode(packet, ‘ /’)

TypeError: b85decode() toma 1 argumento posicional pero se dieron 2

¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error parece estar relacionado con el tamaño del mensaje que se está enviando/recibiendo, en lugar de la función b85decode(). Según el código proporcionado, parece que el tamaño del buffer utilizado para el envío/recepción de datos se establece en 65536, lo cual puede ser demasiado pequeño para los datos de las películas que se están transfiriendo.

    Para solucionar este problema, se podría intentar aumentar el tamaño del buffer tanto en el server.py como en el client.py a un valor más grande, como 1MB o más. Por ejemplo:

    BUFFOR_SIZE_DATA = 1048576  # Tamaño del buffer de 1MB
    

    Además, el código de client.py parece tener un error tipográfico en la llamada de la función b85decode(). La función solo debería tomar un argumento posicional (los datos codificados), por lo que el argumento ‘’/’’ debería eliminarse. El código corregido quedaría así:

    data = base64.b85decode(packet)
    

    ¡Espero que esto ayude!

Comments are closed.