socket real getsockname cliente python tcp twisted packet

real - tcp ip python



Python/Twisted-¿Fragmentación de paquetes TCP? (3)

Al tratar con TCP, realmente debería olvidar toda noción de ''paquetes''. TCP es un protocolo de transmisión: usted transmite datos y las secuencias de datos salen por el otro lado. Una vez que se envían los datos, se permite que lleguen tantos o tan pocos bloques como quiera, siempre que todos los datos lleguen en el orden correcto. Tendrá que hacer la delimitación manualmente como con otros idiomas, con un campo de longitud, o un campo de tipo de mensaje, o un carácter delimitador especial, etc.

En Twisted al implementar el método dataReceived, no parece haber ningún ejemplo que se refiera a paquetes fragmentados. En cualquier otro idioma, esto es algo que implementas manualmente, así que solo me preguntaba si esto ya está hecho para ti en retorcido o qué? Si es así, ¿tengo que prefijar mis paquetes con un encabezado de longitud? ¿O tengo que hacer esto manualmente? Si es así, ¿de qué manera sería eso?


En el método dataReceived recuperas los datos como una cadena de longitud indeterminada, lo que significa que puede tratarse de un mensaje completo en tu protocolo o puede ser solo parte del mensaje que algún "cliente" te envió. Deberá inspeccionar los datos para ver si incluyen un mensaje completo en su protocolo.

Actualmente estoy usando Twisted en uno de mis proyectos para implementar un protocolo y decidí usar el módulo struct para empacar / descomprimir mis datos. El protocolo que estoy implementando tiene un tamaño de encabezado fijo, por lo que no creo ningún mensaje hasta que haya leído al menos HEADER_SIZE la cantidad de bytes. El tamaño total del mensaje se declara en esta porción de datos del encabezado.

Supongo que realmente no necesita definir una longitud de mensaje como parte de su protocolo, pero ayuda. Si no definió uno, debería tener un delimitador especial que determina cuándo comienza / finaliza un mensaje. Más o menos cómo el protocolo FIX usa el byte SOH para delimitar los campos. Aunque tiene un campo obligatorio que le indica cuánto tiempo dura un mensaje (simplemente no cuántos campos hay en un mensaje).


También puede usar un protocolo LineReceiver