NetworkStream.Schreiben Sie kehrt sofort - wie kann ich erzählen, wenn es beendet das senden von Daten?

Trotz der Dokumentation, NetworkStream.Schreiben scheint nicht zu warten, bis die Daten gesendet wurden. Stattdessen wartet er, bis die Daten kopiert wurde, um einen Puffer und kehrt dann zurück. Die Puffer übertragen wird, in den hintergrund.

Dies ist der code, den ich im moment haben. Ob ich ns.Schreiben oder ns.BeginWrite egal - beide sofort wieder zurück. Die EndWrite auch sofort zurückkehrt (was Sinn macht, da ist es beim schreiben in den send-Puffer nicht schreiben in das Netzwerk).

    bool done;
    void SendData(TcpClient tcp, byte[] data)
    {
        NetworkStream ns = tcp.GetStream();
        done = false;
        ns.BeginWrite(bytWriteBuffer, 0, data.Length, myWriteCallBack, ns);
        while (done == false) Thread.Sleep(10);
    }
   
    public void myWriteCallBack(IAsyncResult ar)
    {
        NetworkStream ns = (NetworkStream)ar.AsyncState;
        ns.EndWrite(ar);
        done = true;
    }

Wie kann ich erkennen, Wann die Daten tatsächlich an den client gesendet?

Will ich warten, für 10 Sekunden(zum Beispiel) eine Antwort von dem server nach dem senden meiner Daten sonst nehme ich an, dass etwas falsch war. Wenn es dauert 15 Sekunden, um zu senden, meine Daten, dann wird es immer timeout, da kann ich nur mit dem zählen beginnen aus, wenn NetworkStream.Schreiben Sie kehrt, bevor die Daten gesendet wurden. Ich will anfangen zu zählen 10 Sekunden aus, wenn die Daten verlassen hat, meine Netzwerkkarte.

Datenmenge und die Zeit zu schicken, könnte es variieren - es könnte in 1 Sekunde zu senden, es könnte in 10 Sekunden zu senden, es könnte eine minute dauern, um es zu senden. Der server sendet eine Antwort, wenn Sie die Daten erhalten hat (es ist ein smtp-server), aber ich will nicht ewig warten, wenn meine Daten war ungültig und die Antwort wird nie kommen, das ist, warum ich muss wissen, ob ich warte, bis die Daten gesendet werden, oder wenn ich bin, wartet der server darauf reagieren.

Vielleicht möchte ich zeigen den status an den Benutzer, würde ich mag, um zu zeigen, "senden von Daten an server", und "warten auf Antwort vom server" - wie konnte ich das tun?

  • Haben Sie versucht, NetworkStream.Schreiben Sie mit einem 100MB Paket?
InformationsquelleAutor dan gibson | 2008-09-15
Schreibe einen Kommentar