Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
sockets TCP - desbordamiento de buffer
#1
hola,

estoy analizando en profundidad los sockets con datos muy grandes. En concreto son imagenes.

El esquema es: Un emisor de graficos, multiples clientes, un servidor de sockets TCP que hace broadcast.

el problema es que el emisor genera datos más rapidamente que los clientes los consumen, provocando que el buffer sellena totalmente y se bloquea.

La unica manera que he encontrado es establecer una demora en el emisor de 2 segundos para cada envio de datos.

¿hay alguna posibilidad de hacerlo de otra manera? Alo que en ingles llaman un "flush" del bufer

La parte del emisor ahora está asi:


Código:
while True:
   # obtenemos la pantalla
   imagen = ImageGrab.grab()
   salida = io.BytesIO()
           
   # grabamos la imagen en el fichero de memoria
   imagen.save(salida, format="PNG")
   msg = struct.pack('>I', len(salida.getvalue())) + salida.getvalue()

   # enviamos el mensaje
   self.sock.sendall(msg)

   #hacemos tiempo para enviar el siguiente "pantallazo"
   time.sleep(2)

y, ciertamente, esto me parece horrible

La parte del cliente/receptor se ve asi:

Código:
     while recepcion:    # recepcion = True   not recepcion = False
           data = None
           diccionario = {}
           # Recupera los primeros 4 bytes del mensaje
           tot_len = 0
           while tot_len < self.RECV_MSG_LEN:
               msg_len = self.sock.recv(self.RECV_MSG_LEN)
               tot_len += len(msg_len)
           # Si el mensaje tiene los 4 bytes que representan la longitud ...
           if msg_len:
               data = b''
               # Desempaqueta el mensaje y obtiene la longitud del mensaje
               msg_len = struct.unpack('>I', msg_len)[0]
               tot_data_len = 0
               while tot_data_len < msg_len:
                   # Recupera el fragmento del tamaño máximo de RECV_BUFFER
                   chunk = self.sock.recv(self.RECV_BUFFER)
                   # Si no hay el pedazo esperado ...
                   if not chunk:
                       data = None
                       break # ... Simplemente sale del bucle
                   else:
                       # Une el contenido de los pedazos
                       data += chunk
                       tot_data_len += len(chunk)
Responder


Mensajes en este tema
sockets TCP - desbordamiento de buffer - por calvicius - 02-02-2018, 04:14 PM

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)