2014-10-06 2 views
2

Я хочу, чтобы обрабатывать данные POST в программе C CGI на LINUX (SLES64)читает стандартный ввод с веб-сервера

В качестве первого шага я получаю HTTP заголовок с длиной содержимого.

Теперь я хочу прочитать данные POST со стандартного ввода.

Я хочу прочитать AT MOST 5000 байт данных cgi. Каждый POST с большим количеством игнорируется!

number_of_bytes_read = read(0, buffer, content_length); 

Теперь есть один частный случай:

Пользователь заполняет форму в браузере, а затем он нажимает кнопку.

Веб-сервер Apache получает заголовки запросов вместе с данными формы.

Apache принимает заголовок запроса «длина контента», в этом случае 4875 байт, он также принимает байтовый поток длиной 4875 байтов.

Теперь Apache создает новый процесс, который в конечном итоге обработает данные cgi.

Apache должен передать 4875 байт данных cgi новому процессу.

Как он это делает?

Выполняет ли он взаимодействие между процессами, так что Apache создает сокет для нового процесса?

В этом случае другая сторона, программа CGI может возникнуть следующая проблема:

Программа CGI получает длину содержимого, хочет прочитать 4875 байт за один проход, но из-за задержек сети получает первый раз всего 4300 байт.

Но если Apache не создает сокет для нового процесса cgi (inter process comm.), Может ли быть в том, что программа cgi также не захватывает все байты в первый раз?

ответ

2

Возможно, что чтение не вернет 5000 байтов из-за сетевых задержек и других факторов. Вы хотите прочитать до тех пор, пока не прочитаете EOF, или количество прочитанных байтов не достигнет 5000, или read вернет код ошибки, вызвав, например, чтение в цикле. Из read(2): страница руководства

В случае успеха, количество прочитанных байт возвращается (ноль означает конец файла), а позиция файла продвигается по этому номеру. Это не ошибка, если это число меньше количества запрошенных байтов; это может произойти, например, из-за того, что на данный момент доступно меньше байтов (возможно, потому, что мы были близки к концу файла или потому, что мы читаем из канала или с терминала), или потому, что read() был прерван сигнал. При ошибке возвращается -1, а errno устанавливается соответствующим образом. В этом случае не указывается, изменяется ли позиция файла (если таковая имеется).

+1

«* Вы хотите прочитать, пока не будете читать EOF ... *», или пока сумма значений, возвращаемых всем вызовом 'read()', не добавила до 5000 или 'read()' return ' -1'. – alk

+0

Спасибо, что поймал это, я обновил свой ответ. – CalumMcCall

Смежные вопросы