¿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!
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:
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í:
¡Espero que esto ayude!