TCP/IP, así como UDP, los paquetes incluyen alguna referencia a su tamaño . El IP header contiene un campo de 16 bits que especifica la longitud de los datos del encabezado IP y en bytes. El TCP header contiene un campo de 4 bits que especifica el tamaño del encabezado TCP en palabras de 32 bits. El UDP header contiene un campo de 16 bits que especifica la longitud de los datos del encabezado UDP y en bytes.
Aquí está la cosa.
Utilizando los sockets estándar de Windows, ya sea que esté utilizando el espacio de nombres System.Net.Sockets en C# o el contenido Winsock nativo en Win32, nunca verá los encabezados IP/TCP/UDP . Estos encabezados se eliminan de modo que lo que obtienes cuando lees el socket es la carga real, es decir, los datos que se enviaron.
El patrón típico de todo lo que he visto y hecho utilizando sockets es que define un encabezado de nivel de aplicación que precede a los datos que desea enviar. Como mínimo, este encabezado debe incluir el tamaño de los datos a seguir. Esto le permitirá leer cada "mensaje" en su totalidad sin tener que adivinar su tamaño. Puede obtener todo lo elegante que desee, por ejemplo, patrones de sincronización, CRC, versión, tipo de mensaje, etc., pero el tamaño del "mensaje" es todo lo que necesita .
Y por lo que vale, sugeriría utilizar un encabezado en lugar de un delimitador de fin de paquete. No estoy seguro de si hay una desventaja significativa para el delimitador de EOP, pero el encabezado es el enfoque utilizado por la mayoría de los protocolos de IP que he visto.Además, me parece más intuitivo procesar un mensaje desde el principio en lugar de esperar a que aparezca algún patrón en mi transmisión para indicar que mi mensaje está completo.
EDIT: Acabo de enterarme del proyecto Google Protocol Buffers. Por lo que puedo decir, es un esquema de serialización/deserialización binario para WCF (estoy seguro de que es una simplificación excesiva). Si está utilizando WCF, no tiene que preocuparse por el tamaño de los mensajes que se envían porque la plomería WCF se encarga de esto detrás de escena, que es probablemente la razón por la que no ha encontrado nada relacionado con la longitud del mensaje en el Protocolo Documentación de Buffers Sin embargo, en el caso de los enchufes, saber el tamaño ayudará enormemente como se discutió anteriormente. Supongo que serializará sus datos usando los Buffers de Protocolo y luego insertará cualquier encabezado de aplicación que se le ocurra antes de enviarlo. En el lado de recepción, sacará el encabezado y luego deserializará el resto del mensaje.
Si se refiere a protobuf-net, no, no es solo para WCF; hay ejemplos de sockets en el proyecto. –