Вы путаете TCP и HTTP. Если вы по TCP послали кусок данных, то он так и будет принят на том конце. Когда вы пошлёте продолжение, то продолжение будет так же обработано сервеом. Если смотреть на эту ситуацию с точки зрения HTTP, то HTTP серверу наплевать, каким порциями будут приходить данные. Хоть по одному байту посылайте.
История с Content-Length - это совсем другая тема и предназначена как раз для того, чтобы сервер знал, сколько всего данных надо принять (не важно какими частями). А до этого он просто читает по строкам (заголовки запроса) до тех пор, пока не встретит два перевода строки подряд. И да, он будет ждать столько, сколько нужно.
Если я вышлю кусок HTTP запроса, сервер ведь его обработает и выдаст что-то вроде "страница не найдена" или вообще HTTP ERROR.
Учитывая, что он читает по строкам, то ничего такого не произойдёт.
UPD Ах да, про отправку. Это будет что-то в таком духе (если char * buff)
int sent = 0;
while (sent < buff_size) {
int rc = send(sock, buff + sent, buff_size - sent, 0);
if (rc > 0) {
sent += rc;
} else if (rc == SOCKET_ERROR) {
// handle error
}
}