How are commands usually separated from payloads? I know in advance how big the payload will be, should I send the length beforehand?
Yes. A typical pattern would be to send a fixed-length header (e.g. number-of-bytes, in big-endian integer format), followed by the actual bytes of data (and optionally, repeat as necessary). Be sure to use a fixed-width type for your header (e.g uint64_t rather than unsigned long), since you'd (presumably) like your protocol to work the same regardless of what machine it is compiled on.
I am also thinking about just using HTTP to transfer the files, any opinions on whether this will be less time consuming? I am using .NET so the underlying protocols are working well already.
Either way will work fine. Use whatever you're most comfortable with.