¿Hay alguna forma de diferenciar las cargas útiles de diferentes paquetes mientras se usa la función de bloqueo leída en la programación c? Estoy enviando cada mensaje en un paquete desde el cliente TCP y cuando lo leo (usando la función de lectura) en un servidor TCP, obtengo todos los mensajes juntos en un búfer sin ningún delimitador en el medio.

1
Govindh 15 dic. 2016 a las 09:12

2 respuestas

La mejor respuesta

Tendrá que implementarlo usted mismo en la capa de aplicación.

Un enfoque es, por ejemplo, Tipo-Longitud-Valor.

Cada mensaje que envía tiene la siguiente estructura:

1 byte | 2 byte | length bytes
type    length   value

Más detalles aquí.

Tenga en cuenta que read no lee exactamente el número de bytes especificado, puede leer menos, por lo que debe verificar su valor de retorno. Por ejemplo, consulte este .

También hay algunas trampas con los protocolos binarios que puede querer ser consciente de.

También es aconsejable que lea un poco la programación de la red, por ejemplo aquí: consulte el capítulo 7.

4
Community 23 may. 2017 a las 11:53

TCP está orientado a la transmisión, lo que significa que no hay paquetes que pueda separar, por lo que debe implementar su protocolo, por ejemplo, puede enviar 4 bytes de datos de encabezado antes de enviar cada paquete y decirle al receptor el siguiente tamaño de paquete, en el lado receptor, siempre debe leer un encabezado de 4 bytes (que identifica el siguiente tamaño de paquete) y hacer una lectura de bloqueo con el tamaño especificado en el encabezado.

Otra opción es utilizar paquetes de tamaño fijo, por lo que cada vez que tenga que leer un paquete de tamaño fijo desde el búfer TCP.

A diferencia de TCP, UDP está orientado a paquetes, tal como lo desea. en UDP los paquetes se reciben en el tamaño de los enviados y no se producirá ningún otro almacenamiento en búfer o concatenaciones, pero no es confiable.

2
e.jahandar 15 dic. 2016 a las 06:31