Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How C++ `recv` function acts at data receving? Could it receive a partial "packet"?

static void HandlePackets(void* pParams)
{
   int iResult = 0;
   char recvbuf[MAX_PACKET_LENGTH];

   printf("Packet handling started\n");

   while((iResult = recv(lhSocket, recvbuf, MAX_PACKET_LENGTH, 0)) > 0)
      printf("Bytes received: %d\n", iResult);

   printf("Packet handling stopped with reason %i", WSAGetLastError());
}

For now, it only prints the amount of bytes received.

Could such things happen, that recv will receive only a half of packet? Or one full packet and half of next packet, if server sent them one by one fast?

For example, server sent a single packet with 512 bytes length, is it possible that recv first got 500 bytes, and the remain 12 will receive from second attempt?

If server sending a lot of packets with 512 bytes length for each, is it possible that recv will get 700 bytes from first executing and the remain bytes from second?

MAX_PACKET_LENGTH is 1024

(I talk here about application layer packets, not transport layer.)

The whole problem is - do I need to make some possibility for client to combine received bytes into one packet or split over-received bytes to different packets?

like image 738
Kosmo零 Avatar asked Dec 28 '22 06:12

Kosmo零


1 Answers

Is it possible that recv first got 500 bytes, and the remain 12 will receive from second attempt?

Yes, definitely.

You have no guarantee that, when the sending end sends a burst of X bytes, that the receiving end will pick them all up in a single call to recv. recv doesn't even know how many bytes are in your application-layer "packet".

The whole problem is - do I need to make some possibility for client to combine received bytes into one packet or split over-received bytes to different packets?

Your application will definitely have to accumulate data from possibly sequential reads, fill up a buffer, and implement parsing to look for a full packet.

TCP/IP doesn't know your application's protocol; as David said, if you want to split the incoming data stream into "packets" then you must do that yourself.

like image 62
Lightness Races in Orbit Avatar answered Jan 13 '23 13:01

Lightness Races in Orbit