Q: Does TCP receiver ever overflow due to a fast sender?
A: should not. When the receiver buffer is full, the receiver sends AdvertizedWindowSize to informs the sender. If sender app ignores it and continues to send, then sent data will remain in the send buffer and not sent over the wire. Soon the send buffer will fill up and send() will block. On a non-blocking TCP socket, send() returns with error only when it can’t send a single byte. (UDP is different.)
Non-block send/receive operations either complete the job or returns an error.
Q: Do they ever return with part of the data processed?
A: Yes they return the number of bytes transferred.
Partial transfer is considered “completed”.