When you send() bytes with your application, TCP completes a segment at the last byte of the send() and sets the PSH flag. This notifies the receiving stack that it should complete the application's recv() early even if it doesn't fill the buffer.
However... receivers who expect a short recv() to mean that was a send() boundary at the sender will flake out unexpectedly when, in practice, that doesn't always turn out to be true.