2015-08-09 2 views
0

Моя программа устанавливает HTTP-сервер. После вызова listen() и accept(), как я прочитал запрос GET, как это:Как читать запрос GET от клиента C

GET /path HTTP/1.1\r\n\r\n 
+2

Подсказка: что означает 'accept()' return? Какие функции работают с возвращаемым значением? – user2864740

+1

Ummm вызывает функцию 'recv()'? Хорошо, со всей серьезностью, проверьте [Руководство Beej] (http://beej.us/guide/bgnet/) на программирование сокетов. И вы можете прочитать [HTTP RFC] (http://tools.ietf.org/html/rfc2616), потому что HTTP-запрос может иметь дополнительные заголовки. – selbie

ответ

1

Предполагая, что вы можете использовать блокирующий сокет, сначала вы должны знать, если данные доступны для чтения. Что вы можете сделать, используя , выберите 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 розетками.

+0

Примечание: если это всего лишь простая учебная вещь, и вы обрабатываете только один сокет за раз, вам не нужно 'select'. – immibis

+2

Выполнение этого 'int addr_len; ... accept (..., (socklen_t *) & addr_len) 'Плохая идея. Вместо этого вы должны определить 'socklen_t addr_len;' и опустить бросок. – alk

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