Umgang mit WinRT StreamSocket trennt (beide server-und client-Seite)

Ich habe eine Anwendung, die ich Schreibe, für Windows 8/WinRT verwendet, die StreamSocket-API zu tun, eine streaming-Verbindung zu einem server. Das heißt, streamt der server Daten an den client, manchmal mit meta-tags, und die Verbindung trennen können Sie jederzeit.

Das problem das ich habe ist, dass ich keine Ahnung habe, wie zu erkennen, wenn die server getrennt wurde. Dort nicht erscheinen zu sein irgendwelche Ereignisse oder Eigenschaften auf das StreamSocket-Klasse, entweder die input-oder output-Ströme, oder auf dem DataReader - /data-Writer-Klassen, die nichts zu tun mit Verbindung, status.

Oben auf, dass das DataReader-ReadAsync-Methode ist nicht zu Versagen, nachdem der server-Seite trennt die Verbindung zum client. Stattdessen wird der Vorgang erfolgreich ausgeführt, so weit ich erzählen kann, und die Daten, die er füllt in seinem Puffer wird nur die Letzte Sache, die dem server gesendet werden (D. H. es ist nicht-clearing-internen Puffer, auch wenn ich sehe, dass es "verbraucht" jedes mal in den Puffer nenne ich ReadByte). Das macht es bei jedem nachfolgenden Aufruf von ReadAsync - Auffüllen des Puffers mit dem, was der server gesendet die Letzte, bevor es getrennt wird. Hier ist eine vereinfachte version des Codes:

    public async Task TestSocketConnectionAsync()
    {
        var socket = new StreamSocket();
        await socket.ConnectAsync(new HostName(Host), Port.ToString(),
            SocketProtectionLevel.PlainSocket);
        var dr = new DataReader(socket.InputStream);
        dr.InputStreamOptions = InputStreamOptions.Partial;

        this.cts = new CancellationTokenSource();
        this.listenerOperation = StartListeningAsync(dr, cts);
    }

    public async Task StartListeningAsync(DataReader dr, CancellationTokenSource cts)
    {
        var token = cts.Token;
        while (true)
        {
            token.ThrowIfCancellationRequested();
            var readOperation = dr.LoadAsync(1024);
            var result = await readOperation;
            if (result <= 0 || readOperation.Status != Windows.Foundation.AsyncStatus.Completed)
            {
                cts.Cancel(); //never gets called, status is always Completed, result always > 0
            }
            else
            {
                while (dr.UnconsumedBufferLength > 0)
                {
                    byte nextByte = dr.ReadByte();

                    //DriveStateMachine(nextByte);
                }
            }
        }
    }
InformationsquelleAutor Jeremy Bell | 2012-04-10
Schreibe einen Kommentar