You're thinking in the right direction. You do need to pass a control byte back and forth, and the nice thing about that is that when you get it right you can do some really cool things with the synchronization.
The way I did client server communication was to define a packet, and pass a control byte (with a value of 0) back and forth. If you (the client or server) have the control byte, you can send a packet. If not, you pass the control byte back. If you don't have the control byte, you're listening for a packet.
My packets are made up of a 3 byte header: The first byte is a channel identifier (a number between 1 and 255). The last two are halves of a ushort. The ushort contains the amount of user data trailing the packet header, so the receiving machine knows how many bytes to read before receiving the control byte, and maybe sending a packet of it's own.
You can download my codeproject article and have a look at how I did it
here.
Good luck.
- Pete