2009-01-26 15 views
11

Estoy usando C# .Net y la clase Socket del espacio de nombres System.Net.Sockets. Estoy usando los métodos de recepción asíncrona. Entiendo que esto se puede hacer más fácilmente con algo así como un servicio web; esta pregunta surge de mi curiosidad más que de una necesidad práctica.C# stream ¿recibió todos los datos?

Mi pregunta es: supongamos que el cliente está enviando algún objeto serializado binario de una longitud desconocida. En mi servidor con el socket, ¿cómo sé que se ha recibido el objeto completo y que está listo para la deserialización? He considerado anteponer el objeto con la longitud del objeto en bytes, pero esto parece innecesario en el mundo .Net. ¿Qué pasa si el objeto es más grande que el buffer? ¿Cómo podría saber, 'hey, tengo que cambiar el tamaño del buffer porque el objeto es demasiado grande'?

Respuesta

11

Usted sea necesario el protocolo para ser auto-terminación (como XML es, efectivamente - sabes cuando haya terminado de recibir un documento XML cuando se cierra el elemento raíz) o lo que necesita longitud de prefijo los datos, o, necesitan el otro extremo para cerrar la transmisión cuando esté lista.

En el caso de un protocolo autocompletado, debe tener suficientes ganchos para que el código de lectura pueda indicar cuándo ha finalizado. Con la serialización binaria, es posible que no tenga suficientes ganchos. El prefijo de longitud es, de lejos, la solución más fácil aquí.

4

Si usa conectores puros, necesita conocer la longitud. De lo contrario, el tamaño del búfer no es relevante, porque incluso si tiene un búfer del tamaño de los datos completos, aún puede no leer todo en él - verifique el método Stream.Read, devuelve el nr de mordiscos realmente leídos, por lo que debe realizar un ciclo hasta que se reciban todos los datos.

0

Sí, no se deserializará hasta que haya registrado todos los bytes.

Cuestiones relacionadas