#c #sockets #http #post #server
#c #сокеты #http #Публикация #сервер
Вопрос:
Я пишу веб-сервер на языке C. Когда мой сервер получает POST-запрос **, сервер может использовать функцию recv () для чтения POST-запроса. Код для чтения запроса:
char buffer[1024];
memset(buffer,0,sizeof(buffer));
recv(client_socket,buffer,sizeof(buffer),0);
printf("buffer: %s", buffer);
запрос выглядит следующим образом:
POST / HTTP/1.1
Host: 127.0.0.1:8080
Origin: http://127.0.0.1:8080
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Connection: keep-alive
Но я не могу прочитать данные тела POST-запроса. (данные представлены в форме, отправленной клиентом с использованием метода POST) Как я могу получить доступ к этим данным?
Комментарии:
1. HTTP 1.1 основан на TCP. TCP — это протокол байтового потока, в котором нет ни начала, ни конца потока. Это означает, что один
recv
вызов может получить меньше, чем было передано за одинsend
вызов. Или из нескольких вызововsend
(включая частичные данные). Вы должны иметь возможность извлекать поля заголовка из возможных нескольких вызововrecv
, а затем использовать информацию, полученную в заголовке (напримерContent-Length
), чтобы определить объем данных тела для получения. А затем, возможно, использовать больше вызововrecv
для его получения.2. Спасибо за ваше объяснение. Я думаю, что я извлек все содержимое заголовка, включая Content-Lengrh: 10 . Таким образом, это может означать, что длина данных тела равна 10. Но я могу знать только длину данных тела, как я могу узнать фактическое значение. Например, я использую HTML-форму на стороне клиента и ввожу строку «ABC» в текстовое поле формы, а затем отправляю форму на свой сервер с помощью POST. Как я могу прочитать строку «ABC» на стороне моего сервера. Несколько вызовов ‘recv’ могут просто считывать все содержимое заголовка, но не тела?
3. @smallwhite: «Множественные вызовы ‘recv’ могут просто считывать все содержимое заголовка, но не тела?» — Этого не должно быть. Вызов
recv
в цикле должен дать вам полный HTTP-ответ, включая как заголовок, так и тело.4. Спасибо большое! второй вызов recv прочитал тело!
5. @smallwhite: вы не можете полагаться на то, что первый
recv
вызов получит заголовок, а второй вызов получит тело. Например, первый вызов может дать вам половину заголовка, а второй вызов может дать вам остальную часть заголовка и начало тела. Единственный способ узнать, где начинается заголовок, — это найти пустую строку, то есть искатьrnrn
.