.net - ¿NetworkStream.DataAvailable ve datos almacenados en el búfer?
(2)
¿NetworkStream.DataAvailable sabe si el búfer de envío del remitente está vacío? ¿O simplemente indica si el buffer de lectura del receptor tiene datos? Mi suposición es la última ...
Específicamente, para algunos trabajos de socket que implican una conversación continua, actualmente uso un prefijo de longitud para que el receptor sepa exactamente cuántos datos hay en el lote actual; sin embargo, me enviaron un .patch sugiriendo que use NetworkStream.DataAvailable en su lugar. Mi preocupación es que esto solo dirá lo que recibió el receptor, no lo que el remitente envió originalmente, pero yo no soy un experto en sockets.
¿Me equivoco? ¿O es el prefijo de longitud el camino a seguir?
(Tenga en cuenta que no puedo simplemente leer () hasta que se cierre la secuencia, ya que se envían varios lotes en la misma conexión, y es vital que trate cada lote como separado, si leo demasiado en un lote (incluso si se amortigua y descarta) entonces la conversación se romperá).
Si necesita saber cuándo el receptor ha recibido todos los datos para un mensaje en particular, entonces definitivamente necesita el prefijo de longitud.
Normalmente, defino una estructura similar a esta que sale al frente de cualquier mensaje binario que envío.
struct Header
{
int packetIdentifier;
int protocolVersion;
int messageType;
int payloadSize;
}
El identificador le permite determinar si tiene un mensaje válido de su tipo de protocolo. La versión te permite revisar tu protocolo. El tipo de mensaje es el tipo de mensaje (es decir: CommsOnline). El tamaño de la carga útil es el tamaño del cuerpo del mensaje.
Un lado de una conexión no sabrá si el buffer de envío del otro lado está vacío.
DataAvailable
solo indica si hay datos entrantes para leer. Puede usarlo antes de Read()
, pero solo no le proporciona la información que desea. No te dice el comienzo y el final de cada lote.
Codifiqué una conversación de ida y vuelta antes, y utilicé prefijos de longitud en los datos. Lo que hice fue escribir funciones auxiliares que leen una cantidad exacta de bytes (fragmentos a la vez) y no más.
La única alternativa a los valores de longitud de lote en la transmisión es una forma de examinar los datos entrantes y reconocer los inicios y finales de los lotes.