Моя программа устанавливает HTTP-сервер. После вызова listen()
и accept()
, как я прочитал запрос GET, как это:Как читать запрос GET от клиента C
GET /path HTTP/1.1\r\n\r\n
Моя программа устанавливает HTTP-сервер. После вызова listen()
и accept()
, как я прочитал запрос GET, как это:Как читать запрос GET от клиента C
GET /path HTTP/1.1\r\n\r\n
Предполагая, что вы можете использовать блокирующий сокет, сначала вы должны знать, если данные доступны для чтения. Что вы можете сделать, используя , выберите api.
Далее accept возвращает один разъем FD для вас. Используя этот сокет FD, вы можете получать данные.
Accept пример кода
struct sockaddr_in client_addr;
int addr_len;
int new_fd;
addr_len = sizeof(struct sockaddr_in);
new_fd = accept(socket_fd, (struct sockaddr *)&client_addr,(socklen_t *)&addr_len);
Выбрать и прочитать пример
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100;
ret_value = select(max_fd + 1, READ_FD_SETS, NULL , NULL , &timeout);
if ((ret_value <= 0) && (errno!=EINTR))
{
//error
}
else
{
//read data now
rc = recv(new_fd, buffer, buffer length, 0)
}
Примечание: Если вы хотите более высокую производительность вы можете, как R & D на Epoll розетками.
Примечание: если это всего лишь простая учебная вещь, и вы обрабатываете только один сокет за раз, вам не нужно 'select'. – immibis
Выполнение этого 'int addr_len; ... accept (..., (socklen_t *) & addr_len) 'Плохая идея. Вместо этого вы должны определить 'socklen_t addr_len;' и опустить бросок. – alk
Подсказка: что означает 'accept()' return? Какие функции работают с возвращаемым значением? – user2864740
Ummm вызывает функцию 'recv()'? Хорошо, со всей серьезностью, проверьте [Руководство Beej] (http://beej.us/guide/bgnet/) на программирование сокетов. И вы можете прочитать [HTTP RFC] (http://tools.ietf.org/html/rfc2616), потому что HTTP-запрос может иметь дополнительные заголовки. – selbie