2013-03-05 6 views
5

Ich habe eine WinRT-Anwendung, die Uploads mit StreamSocket und DataWriter durchführt. Es verfolgt die Zeit, die der Upload dauert und berechnet dann den Durchsatz.Wie erhält man eine Paket-Upload-Bestätigung mit WinRT StreamSockets?

Das Problem, das ich habe, ist, dass ich Durchsätze viel höher als Wireshark erhalte. Dies liegt daran, dass meine Upload-Schleife beendet ist und den Endzeitstempel verwendet, bevor das WinRT-Framework die Daten tatsächlich an die Netzwerkschicht gesendet hat. Ich habe keine Möglichkeit gefunden, eine Bestätigung von dem Rahmen zu erhalten, dass die Pakete tatsächlich die Netzwerkschicht erreicht haben. Die DataWriterStoreAsync Methode gibt nur die Anzahl der Bytes zurück, die Sie gespeichert haben, die ich kannte, bevor ich sie speicherte.

Andere Frameworks, z. B. Windows Phone, verfügen über einen Rückruf, der ausgelöst wird, nachdem das Paket gesendet wurde, und gibt an, wie viele Byte Sie hochgeladen haben. Ich habe keine Entsprechung in WinRT gefunden und musste mich mit einer Schleife begnügen, die aufzeichnet, wie viele Bytes ich in der StoreAsync Funktion festgeschrieben habe.

Gibt es eine Möglichkeit, eine Bestätigung aus dem Rahmen zu erhalten, wann und wie viele Bytes tatsächlich an die Netzwerkschicht gesendet wurden?

UPDATE: Ich habe die Vorschläge von @ polkduran versucht, und während sie dazu beitrugen, einen Teil des Paketverlusts zu verringern, habe ich immer noch einen erheblichen Paketverlust bei kleineren Datei-Uploads (100KB). Bei größeren Dateien (4 MB und 10 MB) werden alle Pakete gesendet, aber die Endzeit ist immer noch um ein paar Sekunden unterbrochen, was die Durchsatzberechnung erheblich verzerrt (im Vergleich zu Wireshark-Traces). Meine Vermutung ist, dass der Callback die Uploads nur ein wenig verlangsamt, anstatt eine tatsächliche Paket-Upload-Bestätigung zu liefern.

Ich bin immer noch auf der Suche nach einer Lösung für dieses Problem.

EDIT: Ich habe ein Support-Ticket mit Microsoft zu diesem Problem erstellt. Ihre offizielle Antwort ist, dass es im WinRT-Framework keine Möglichkeit gibt zu bestätigen, dass ein Paket tatsächlich hochgeladen wurde.

Antwort

2

ich nicht versucht haben, aber Sie können einen Handler zum Completed Callback-Eigenschaft in der von der StoreAsync Methode des DataWritter Objekt zurückgegeben DataWriterStoreOperation zuweisen.

Oder

Sie können von Ihrem StreamSocket direkt die WriteAsync Methode aus der OutputStream Eigenschaft verwenden, die einen IAsyncOperationWithProgress Betrieb zurückzukehren.

+1

Ja! Ihr erster Vorschlag war die Lösung. Ich konnte den 'Completed' Callback des zurückgegebenen 'DataWriterStoreOperation'-Objekts verwenden, um jedes Paket zu senden und sich selbst anzurufen, anstatt sie in einer Schleife zu senden. Der Parameter 'IAsyncOperation ', der an die Callback-Funktion übergeben wird, hat eine Methode namens 'GetResults', die Ihnen die gesendeten Bytes liefert. Genau das habe ich gesucht. Vielen Dank! Das war eine enorme Hilfe für mich. – jokeefe

+0

Ich sprach leider zu früh, leider. Keine dieser Lösungen löst das Problem vollständig. In meinem ersten Test habe ich es in einer HTTP-Upload-Implementierung verwendet, so dass der Code tatsächlich darauf wartete, dass das 200 OK vom Server empfangen wurde, bevor es beendet wurde, was dazu führte, dass es die ganze Zeit wartete. Nachdem ich versucht habe, dies in einem FTP-Upload zu implementieren, hat es weiterhin den vollständigen Upload abgeschlossen, bevor der Server tatsächlich alle Pakete empfangen hat, als ich kleinere Dateigrößen (100 KB) hochgeladen habe. Ich denke, all dies hat es ein wenig verlangsamt, aber es ist keine echte Paket-Upload-Bestätigung. – jokeefe

Verwandte Themen