Ho un'applicazione WinRT che esegue caricamenti utilizzando StreamSocket
e DataWriter
. Tiene traccia del tempo richiesto dal caricamento e calcola il throughput.Come ricevere conferma caricamento pacchetto con WinRT StreamSockets?
Il problema che sto avendo è che sto ottenendo throughput molto più alti di quelli di Wireshark. Questo perché il mio ciclo di upload termina e prende il timestamp finale prima che il framework WinRT abbia effettivamente inviato i dati al livello di rete. Non ho trovato alcun modo di ricevere conferma dal framework che i pacchetti hanno effettivamente fatto al livello di rete. Il metodo DataWriter
StoreAsync
restituisce solo il numero di byte che hai memorizzato, che sapevo prima di memorizzarli.
Altri framework, come Windows Phone, hanno un callback attivo che viene attivato dopo l'invio del pacchetto e indica quanti byte sono stati caricati. Non ho trovato alcun equivalente in WinRT e ho dovuto accontentarmi di un ciclo che registra quanti byte ho impegnato nella funzione StoreAsync
.
C'è un modo per ottenere conferma dal framework di quando e quanti byte sono stati effettivamente inviati al livello di rete?
AGGIORNAMENTO: ho dato una prova a suggerimenti di @ polkduran e mentre hanno contribuito ad alleviare parte della perdita di pacchetti, sto ancora sperimentando una significativa perdita di pacchetti in upload di file più piccoli (100 KB). Per i file più grandi (4 MB e 10 MB), tutti i pacchetti vengono inviati, ma l'ora di fine è ancora disattivata di un paio di secondi, il che distorce il calcolo del throughput in modo significativo (rispetto alle tracce di Wireshark). La mia ipotesi è che la funzione di callback abbia solo rallentato un po 'i caricamenti piuttosto che fornire la conferma effettiva del caricamento dei pacchetti.
Sto ancora cercando una soluzione a questo problema.
MODIFICA: ho creato un ticket di supporto con Microsoft su questo problema. La loro risposta ufficiale è che non esiste alcun modo nel framework WinRT per confermare che un pacchetto sia stato effettivamente caricato.
Sì! Il tuo primo suggerimento è stata la soluzione. Sono stato in grado di utilizzare il callback 'Completed' dell'oggetto restituito' DataWriterStoreOperation' per inviare ciascun pacchetto e chiamare se stesso piuttosto che inviarli in un ciclo. Il parametro 'IAsyncOperation' passato alla funzione di callback ha un metodo chiamato 'GetResults' che fornisce i byte inviati. Questo e 'esattamente quello che stavo cercando. Grazie mille! Questo è stato un enorme aiuto per me. –
jokeefe
Ho parlato troppo presto, sfortunatamente. Nessuna di queste soluzioni risolve completamente il problema. Nel mio primo test, l'ho usato in un'implementazione di caricamento HTTP, quindi il codice era in realtà in attesa di ricevere il 200 OK dal server prima che fosse terminato, il che lo obbligava ad attendere il tempo pieno. Dopo aver tentato di implementarlo in un caricamento FTP, ha continuato a completare il caricamento completo prima che il server ricevesse effettivamente tutti i pacchetti quando ho caricato file di dimensioni inferiori (100 KB). Penso che tutto ciò sia stato rallentato un po ', ma non è la vera conferma del caricamento dei pacchetti. – jokeefe