Когда сервер узнает что я закончил передачу? (WinSock)

Рейтинг: 0Ответов: 1Опубликовано: 28.06.2011

Опять в голове получилась "непонятка". Например есть HTTP сервер. Шлю я ему запрос с помощью сокетов. Например я сделал send(sock, buff, buff_size, 0), а вдруг сервер пришли данные меньше, чем buffsize? Что тогда? Сервер ожидает отправки остальной части? Как ее правильно отправить? И другой вопрос, как тогда отправить строку по частям с буффером? Если я вышлю кусок HTTP запроса, сервер ведь его обработает и выдаст что-то вроде "страница не найдена" или вообще HTTP ERROR.

Ответы

▲ 4Принят

Вы путаете 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
    }
}