c# - signos - ¿Cómo recibir la confirmación de carga de paquetes con WinRT StreamSockets?
que recibimos en la confirmacion (1)
Tengo una aplicación WinRT que realiza cargas usando StreamSocket
y DataWriter
. Realiza un seguimiento del tiempo que tarda la carga y luego calcula el rendimiento.
El problema que estoy teniendo es que estoy obteniendo rendimientos mucho más altos de lo que muestra Wireshark. Esto se debe a que mi ciclo de carga finaliza y toma la marca de tiempo final antes de que el marco WinRT realmente haya enviado los datos a la capa de red. No he encontrado ningún medio para recibir confirmación del marco de que los paquetes realmente han llegado a la capa de red. El método DataWriter
StoreAsync
solo devuelve la cantidad de bytes que almacenó, que yo sabía antes de almacenarlos.
Otros marcos, como Windows Phone, tienen una devolución de llamada activa que se activa después de enviar el paquete y le informa cuántos bytes ha subido. No he encontrado ningún equivalente en WinRT y he tenido que conformarme con un bucle que registra cuántos bytes he cometido en la función StoreAsync
.
¿Hay alguna forma de obtener confirmación del marco de cuándo y cuántos bytes se han enviado realmente a la capa de red?
ACTUALIZACIÓN: Puse a prueba las sugerencias de @polkduran, y si bien ayudaron a aliviar parte de la pérdida de paquetes, todavía estoy experimentando una pérdida significativa de paquetes en cargas de archivos más pequeños (100 KB). Para archivos más grandes (4MB y 10MB), se están enviando todos los paquetes, pero el tiempo de finalización todavía está desactivado en un par de segundos, lo que distorsiona significativamente el cálculo del rendimiento (en comparación con los rastreos de Wireshark). Supongo que la devolución de llamada solo ralentizó un poco las cargas, en lugar de proporcionar la confirmación de carga del paquete real.
Todavía estoy buscando una solución a este problema.
EDITAR: Creé un ticket de soporte con Microsoft sobre este problema. Su respuesta oficial es que no hay forma en el marco de WinRT para confirmar que un paquete se haya subido realmente.
No lo he intentado, pero puede asignar un controlador a la propiedad de devolución de llamada Completed
en DataWriterStoreOperation
devuelto por el método DataWritter
objeto DataWritter
.
O
Puede usar directamente el método WriteAsync
de la propiedad OutputStream
de su StreamSocket
que devuelve una operación IAsyncOperationWithProgress
.