2013-03-05 13 views
5

Mam aplikację WinRT, która wykonuje przesyłanie przy użyciu StreamSocket i DataWriter. Śledzi czas ładowania, a następnie oblicza przepustowość.Jak otrzymać potwierdzenie wysyłania pakietów za pomocą StreamSockets WinRT?

Problem, który mam, polega na tym, że uzyskuję przepustowość znacznie wyższą niż pokazuje Wireshark. Dzieje się tak dlatego, że moja pętla przesyłania kończy się i zajmuje końcowy znacznik czasu, zanim struktura WinRT faktycznie wysłała dane do warstwy sieci. Nie znalazłem żadnego sposobu na potwierdzenie, że pakiety rzeczywiście dotarły do ​​warstwy sieci. Metoda DataWriterStoreAsync zwraca tylko liczbę przechowywanych bajtów, które znałem przed ich zapisaniem.

Inne frameworki, takie jak Windows Phone, mają wywołanie zwrotne, które jest wyzwalane po wysłaniu pakietu i informuje o liczbie przesłanych bajtów. Nie znalazłem żadnego odpowiednika w WinRT i musiałem zadowolić się pętlą, która rejestruje liczbę bitów, które popełniłem w funkcji StoreAsync.

Czy istnieje sposób na uzyskanie potwierdzenia z ramy, kiedy i ile bajtów zostało wysłanych do warstwy sieci?

AKTUALIZACJA: Podałem sugestie @ polkduran i choć pomogły one złagodzić część utraty pakietów, nadal odczuwam znaczną utratę pakietów przy mniejszym ładowaniu plików (100 KB). W przypadku większych plików (4MB i 10MB) wysyłane są wszystkie pakiety, ale czas zakończenia jest nadal wyłączony o kilka sekund, co znacznie przesuwa obliczenia przepustowości (w porównaniu ze śladami Wireshark). Domyślam się, że wywołanie zwrotne nieco spowolniło wysyłanie, zamiast dostarczać rzeczywiste potwierdzenie przesłania pakietu.

Wciąż szukam rozwiązania tego problemu.

EDYCJA: Stworzyłem zgłoszenie pomocy technicznej dla firmy Microsoft dotyczące tego problemu. Ich oficjalna odpowiedź jest taka, że ​​w systemie WinRT nie ma możliwości potwierdzenia, że ​​pakiet został załadowany.

Odpowiedz

2

nie próbowałem, ale można przypisać do obsługi nieruchomości Completed zwrotnego w DataWriterStoreOperation zwracanej przez metodę obiektu DataWritterStoreAsync.

Albo

można użyć bezpośrednio metodą WriteAsync od nieruchomości OutputStream z StreamSocket które zwracają operację IAsyncOperationWithProgress.

+1

Tak! Twoja pierwsza sugestia była rozwiązaniem. Mogłem użyć wywołania "Completed" zwróconego obiektu 'DataWriterStoreOperation', aby wysłać każdy pakiet i wywołać samą siebie, zamiast wysyłać je w pętli. Parametr 'IAsyncOperation ' przekazywany do funkcji wywołania zwrotnego ma metodę o nazwie 'GetResults', która podaje wysłane bajty. Właśnie tego szukałem. Dziękuję Ci bardzo! To była dla mnie ogromna pomoc. – jokeefe

+0

Niestety, zbyt wcześnie rozmawiałem. Żadne z tych rozwiązań nie rozwiązuje całkowicie problemu. W moim pierwszym teście użyłem go w implementacji przesyłania HTTP, więc kod faktycznie czekał na otrzymanie 200 OK z serwera, zanim został zakończony, co zmusiło go do oczekiwania na pełny czas. Po tym, jak próbowałem to zaimplementować w przesyłaniu FTP, kontynuowałem pełne przesyłanie, zanim serwer faktycznie odebrał wszystkie pakiety, gdy przesyłałem mniejsze rozmiary plików (100 KB). Myślę, że to wszystko spowolniło trochę, ale nie jest to prawdziwe potwierdzenie przesłania pakietu. – jokeefe