2016-05-02 17 views
1

Ich habe einen TcpClient und einen Server geschrieben, die über einen SslStream kommunizieren. Die Kommunikation funktioniert, aber wenn ich eine Nachricht vom Client an den Server sende, liest der Server zuerst 1 Byte, und im nächsten Schritt den Rest. Beispiel: Ich möchte über Client „test“ senden, und der Server empfängt ersten „t“, und dann „est“SslStream EndRead bekommt zuerst 1 Byte

Hier ist der Code für den Client

public void Send(string text) { 
     byte[] message = Encoding.UTF8.GetBytes(text); 
     SecureStream.BeginWrite(message, 0, message.Length, new AsyncCallback(WriteCallback), null); 
    } 

    private void WriteCallback(IAsyncResult AR) { 

    } 

zu senden Und hier der Code der Server verwendet, um zu lesen

private SslStream CryptedStream = ...; 
    private byte[] buffer = new byte[1024]; 

    public void BeginReadCallback(IAsyncResult AsyncCall) { 

     // initialize variables 
     int bytesRead = 0; 

     try { 
      // retrieve packet 
      bytesRead = CryptedStream.EndRead(AsyncCall); 

      // check if client has disconnected 
      if (bytesRead > 0) { 
       // copy buffer to a temporary one 
       var temporaryBuffer = buffer; 
       Array.Resize(ref temporaryBuffer, bytesRead); 

       string read = Encoding.ASCII.GetString(temporaryBuffer); 
       SetText(read); 

       // read more data 
       CryptedStream.BeginRead(buffer, 0, 1024, new AsyncCallback(BeginReadCallback), null); 

       // client is still connected, read data from buffer 
       //ProcessPacket(temporaryBuffer, temporaryBuffer.Length, helper); 
      } else { 
       // client disconnected, do everything to disconnect the client 
       //DisconnectClient(helper); 
      } 
     } catch (Exception e) { 
      // encountered an error, closing connection 
      // Program.log.Add(e.ToString(), Logger.LogLevel.Error); 
      // DisconnectClient(helper); 
     } 
    } 

Habe ich etwas verpassen? Vielen Dank für Ihre Hilfe

+1

Was ist die Frage hier? Eine * streaming connection * sendet in keinster Weise Pakete von Bytes, sie sendet einen Strom von Bytes, beim Lesen muss man darauf vorbereitet sein, kleinere Teile von dem zu bekommen, was * man * ein Paket betrachtet und dieses dann in ein kohärentes Paket zusammenfügt muss sein. –

+0

Ich bin nicht vertraut mit Streams, also vergib mir meine Unerfahrenheit. Also könnte das bedeuten, dass, wenn der Server viel schneller ist, würde ich "t" "e" "s" "t" erhalten? –

+1

Sie * könnten * das empfangen, oder Sie könnten 'tes' und dann' t' oder 't' und dann' est' oder 'te' und dann' st' erhalten. Es hängt von vielen Dingen ab, Geschwindigkeit, Puffer auf Hardware (Ihr Computer, Router und Switches zwischen den beiden Endpunkten, etc.) und Software. Kurz gesagt, Ihr Code muss in der Lage sein, damit umzugehen. –

Antwort

1

Wie Lasse erklärt Streaming-APIs versprechen Sie nicht, eine bestimmte Anzahl von Bytes pro Lese zurückgeben.

Die beste Lösung dafür ist, keine Sockets zu verwenden. Verwenden Sie eine höhere Ebene API wie WCF, SignalR, HTTP, ...

Wenn Sie darauf bestehen, sollten Sie wahrscheinlich BinaryReader/Writer verwenden, um Ihre Daten zu senden. Das macht es ziemlich einfach. Zum Beispiel hat es String-Senden eingebaut. Sie können diese Klassen auch manuell leicht mit der Länge voranstellen.

Wahrscheinlich benötigen Sie kein async IO und sollten es nicht verwenden. Wenn Sie darauf bestehen, können Sie mindestens die Rückrufe mit await loswerden.