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 DataWriter
StoreAsync
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.
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
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