A circular buffer isn't a bad solution, but it can be a little overkill in some cases. For something like this, you'd read until you had a full package, process it, then continue reading into the buffer at the position where you left off until you either have a complete package to work or else you reach the end of the buffer. When you hit the end, you just start reading into the beginning again (hence the 'circular'). You have to keep close track of what data is 'live' and what data is processed, so that you don't accidentally overwrite live data.
You'll end up moving data in either case, but the circular case will defer some of that so that you only have to do moves when you cross the end of the buffer (to reconstitute that package for processing). Circular buffers are usually used in a producer/consumer situation. The socket would produce and some other process would consume the data as needed.
In many cases you know how much you need to read, though. What's your use case here? Or are you just asking for general knowledge?