windows - polstret data i recv () api

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på TCP client server applikation ved hjælp af c ++. Tredjepart lib er nu tilladt i dette projekt.


Her udveksling mellem klient server tager ved hjælp af godt definere protokol format. Da klienten modtager pakken den vil sende den til parsing.I har protokollen manager, der vil tage sig af parsing aktivitet.


Jeg har følgende tvivl
Når dataene kommer til klienten fra netværket, bufferer operativsystemet det til applikationsopkald recv () -funktionen.


Så to beskeder msg1 og msg2 ankommer til bufferen et opkald til recv vil returnere msg1 + msg2. Nu kan dette medføre fejl i parsningsaktiviteten.


Mine spørgsmål
1. Om ovenstående antagelse er korrekt eller ej?
2. Hvis ovennævnte overfald er korrekt, hvordan kan du løse dette problem.

Bedste reference


Revathy,


Hvad du skal gøre her er at lave en fast længdepakke eller i det mindste faste længdeoverskrift efterfulgt af data med variabel længde.


Overskriften skal indeholde størrelsen af ​​pakken. Så i recv-funktionen læser du altid headerbytesen og afkodes størrelsen på pakken og læser resten af ​​pakken ved hjælp af et andet recv-opkald.


På denne måde, selv når dit TCP-lag buffer et antal pakker, kan du læse det korrekt


    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 );

Andre referencer 1


I TCP kan du ikke se pakkegrænser, så hvis begge pakker ankommer, inden du kan ringe recv(), får du begge pakker 'indhold på samme gang.


I UDP bevares pakkegrænser, så hvert opkald til recv() giver tilbage en pakke.