2012-03-29 8 views
0

Ich arbeite an TCP-Client-Server-Anwendung mit C++. Third-Party-Lib sind jetzt in diesem Projekt erlaubt.Gepolsterte Daten in recv() api

Hier der Austausch zwischen Client-Server dauert mit gut definierten Protokoll-Format. Sobald der Client das Paket erhält, wird es es für die Analyse senden. Ich habe Protokoll-Manager, der kümmert sich um die Analyse-Aktivität.

Ich habe folgende Zweifel Wenn die Daten bei Client aus dem Netzwerk ankommen, puffert das Betriebssystem es, bis die Anwendung die Funktion recv() aufruft.

So zwei Nachrichten msg1 und msg2 kommt in den Puffer ein Aufruf an recv wird msg1 + msg2 zurückgeben. Jetzt kann dies zum Fehlschlagen der Parsing-Aktivität führen.

Meine Abfragen 1. ob oben genannte Annahme korrekt ist oder nicht? 2. Wenn die oben genannte Annahme richtig ist, wie kann dieses Problem gelöst werden.

Antwort

0

Revathy,

Was müssen Sie hier zu tun ist, ein Paket fester Länge machen oder zumindest-fester Länge Kopf von Daten mit variabler Länge gefolgt.

Der Header sollte die Größe des Pakets enthalten. In der recv-Funktion lesen Sie also immer die Header-Bytes und dekodieren die Größe des Pakets und lesen den Rest des Pakets mit einem anderen recv-Aufruf.

Auf diese Weise, auch wenn Sie Ihre TCP-Schicht eine beliebige Anzahl von Paketen, die Puffer können Sie es

unsigned char* pBuffer = NULL; 
    pBuffer = new unsigned char[MESSAGE_HEADER_LENGTH]; 

    // reading header from socket 
    int nRet = recv(sock,(char*)pBuffer,MESSAGE_HEADER_LENGTH,0); 
    int nDataLen = //Read the packet length from pBuffer 
    // reading body from socket 

    unsigned char* pPacket = NULL; 
    pPacket= new unsigned char[nDataLen ]; 
    nRet = recv(sock,(char*)pPacket ,nDataLen ,0); 
0

In TCP können Sie keine Paketgrenzen sehen. Wenn also beide Pakete ankommen, bevor Sie recv() anrufen, erhalten Sie den Inhalt beider Pakete auf einmal.

In UDP werden Paketgrenzen beibehalten, so dass jeder Aufruf an recv() ein Paket zurückgibt.

+0

richtig lesen, wie wir in tcp arbeiten, uns geben PLZ Lösung die Anzahl der Pakete zu finden, die wir sind Empfangen mit der recv() API.Auch wird der Client immer die volle Antwort erhalten oder es besteht die Möglichkeit, die Hälfte der Antwort in einer Sortierung und die andere Hälfte in einer anderen Sortierung zu erhalten (zum Beispiel abhängig vom Puffer, den wir für die recv() API definiert haben) – Revathy

+0

Es ist durchaus möglich, halbe Pakete zu erhalten - TCP geht davon aus, dass Sie einen einzelnen Datenstrom übertragen möchten. Jede Struktur dieser Daten muss aus dem Protokoll herauskommen (Datensatzstruktur, Längenfelder oder Escape-Zeichen). Welches Protokoll implementierst du? –

+0

TCP/IP-Protokoll – Revathy