Pregunta

Estoy desarrollando una aplicación en C #, utilizando el modelo cliente-servidor, donde el servidor envía una matriz de bytes con un mapa de bits para el cliente, las cargas del cliente en la pantalla, envía un "OK" al servidor, y el servidor envía otra imagen, y así sucesivamente.

La longitud de los deppends buffer de imagen, por lo general es entre 60 kb y 90kb, pero he visto que no importa. Si pongo el cliente y el servidor en el mismo equipo, usando localhost, todo funciona bien. El servidor hace beginSend, y el cliente hace EndReceive y se transmite a todo el búfer.

Sin embargo, ahora estoy probando esto en una red inalámbrica y lo que ocurre es:

  • El servidor envía la imagen.
  • La función de devolución de llamada data_received en el cliente se llama, pero sólo hay 1460 bytes a leer (MTU - ¿por qué no sólo debe estar en UDP)
  • La función de devolución de llamada data_received en el cliente se llama de nuevo, ahora con el resto de la memoria intermedia (ya sea se trate de 1000 bytes o 100 Kbytes) ...

Es siempre así, se recibe un primer paquete con 1460 bytes, y luego el segundo paquete contiene el resto.

puedo solucionar este uniendo ambas matrices de bytes recibidos, pero esto no parece estar bien. No estoy siquiera seguro de por qué ocurre esto. ¿Es alguna restricción en la red? ¿Por qué entonces no C # esperan a que los datos enteros que han de transmitirse? Es decir, es TCP, que no debería tener que preocuparse por ello, ¿verdad?

De todos modos, cualquier ayuda sería grande!
Saludos

¿Fue útil?

Solución

Es TCP - usted debe tratar los datos como un corriente . Usted no debe preocuparse de cómo la corriente se divide en paquetes, o hacer suposiciones acerca de ella.

Si necesita recibir un solo "bloque" de los datos, la forma más sencilla de hacerlo es fiable para prefijar con la longitud (por ejemplo, como un valor de 32 bits). Uno lee la longitud (teniendo en cuenta que incluso los bytes podría se divida en varios paquetes) y luego leer repetidamente (ya sea sincrónica o asincrónica) tomando nota de lo mucho que leer cada vez, hasta que haya leído todo los datos.

Otros consejos

Tiene una lectura de 9.2.4

  

Cuando la disección de un protocolo de capa de aplicación no se puede asumir que cada paquete TCP contiene exactamente mensaje de capa de una sola aplicación. Uno de los mensajes de capa de aplicación se puede dividir en varios paquetes TCP.

añadir a la respuesta de Juan:

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top