Frage

Ich versuche, einen einfachen SNPP -Client (Simple Network Paging Protocol) mit Sockets zu schreiben. Alles scheint gut zu funktionieren, bis auf eine kleine Inkonsistenz zwischen Servern.

Wenn ich einen Befehl sende, muss ich die Antwort lesen, die normalerweise ein einzelner Datenback ist. Der SNPP -Server von Sprint sendet jedoch Antworten in zwei Teilen. Der erste Datenanteil ist die erste Ziffer des Statuscode. Der zweite Stück ist der Rest. Wenn ich beispielsweise versuche, die Antwort "220 Gateway Ready" zu erhalten, kommt es so ein:

2

Ich muss einen weiteren leeren Befehl senden, um den Rest abzurufen:

20 Gateway ready

Im Moment benutze ich:

byte[] buffer = new byte[256];
socket.Receive(buffer);

Wie kann ich sicherstellen, dass ich alle verfügbaren Daten nach der Ausgabe eines Befehls erhalte, ohne einen separaten Puffer für jeden Datenblock zuzuweisen?

War es hilfreich?

Lösung

Für Sprechantworten würde ich Ihnen empfehlen, Daten wie folgt zu lesen:

using (var resultStream = new MemoryStream())
{
    const int CHUNK_SIZE = 2 * 1024; // 2KB, could be anything that fits your needs
    byte[] buffer = new byte[CHUNK_SIZE];
    int bytesReceived;
    while ((bytesReceived = socket.Receive(buffer, buffer.Length, SocketFlags.None)) > 0)
    {
        byte[] actual = new byte[bytesReceived];
        Buffer.BlockCopy(buffer, 0, actual, 0, bytesReceived);
        resultStream.Write(actual, 0, actual.Length);
    }

    // Do something with the resultStream, like resultStream.ToArray() ...
}

Andere Tipps

Versuchen Sie, die Socket zu überprüfen. Zu den Eigenschaften, um festzustellen, ob Sie erneut empfangen werden müssen.

Ich glaube, ich verstehe deine Frage. Diese Überlastung von Socket.Receive Ermöglicht das Übergeben einer Ganzzahl, um eine Offset -Position anzugeben, um Daten zu platzieren. Wenn Sie 1 Byte haben, können Sie beim ersten Anruf wie in Ihrem Beispiel diese Überladung mit einem Offset von 1 aufrufen und denselben Puffer verwenden.

Socket.Receive Gibt eine Ganzzahl zurück, die die Anzahl der erhaltenen Bytes ist. Sie können prüfen, ob dies 1 ist und anrufen Receive wieder.

byte[] buffer = new byte[256];
int len = socket.Receive(buffer);

if (len == 1)
  socket.Receive(buffer, 1, buffer.Length - 1, SocketFlags.None);

Alle,

Wenn ein Webserver Daten in "Brocken" sendet, geht es jedem Chunk mit seiner Länge voraus (als Zeichenfolge, die den Hex-Wert angibt).

Chunk-Größe [; Chunk-Extensions] Chunk-Data

ZB: 15 Bytes zu Chunk:

F; 123456789abcdef

Das größte Problem beim Empfangen von HTTP -Daten aus einer Socket besteht darin HTTP/1.0 -Verbindung wird niemals passieren.

Sie müssen einen Leser implementieren, der sich um den Sockel wickelt. Es sollte Daten in einen Puffer empfangen und eine "Readline" -Methode bereitstellen, die den Inhalt des Puffers liest, bis es 13 lautet, gefolgt von 10 (CRLF).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top