I'm trying to receive a part of a packet via recvfrom. It actually works like this:
recvfrom(sockfd, serialised_meta, 12, flags, src_addr, addrlen);
recvfrom(sockfd, serialised_buf, BUFLEN, flags, src_addr, addrlen);
The data is sent like this:
bufd->Serialise(serialised_buf, BUFLEN+12);
sendto(sockfd, serialised_buf, BUFLEN+12, flags, dest_addr, addrlen);
So the idea is to read some meta data first and then decide whether to receive something else. The problem is that I receive 4 '/0' bytes in the beginning if second buffer (serialised_buf). It doesn't seem to be serialisation issue, I used my serialisation before, and everything was cool, while I was receiving the whole packet (meta and data) at once. Any ideas on how it could be fixed?
PS. I understand I can just skip unnecessary bytes) But anyway, why it might be happening?
UDP isn't a "stream" protocol... once you do the initial recvfrom, the remainder of the packet is discarded. The second recvfrom is awaiting the next packet...
UDP operates on messages, not streams like TCP does. There is a 1-to-1 relationship between
sendto()
andrecvfrom()
when using UDP. There is no option to receive partial data in UDP, it is an all-or-nothing type of transport. You have torecvfrom()
the entireBUFLEN+12
message in one go, then decide whether you are going to actually use it or not. That is just the way UDP works.