Книга: Программирование для Linux. Профессиональный подход
Листинг 5.12. (socket-inet.c) Чтение страницы с Web-сервера
Листинг 5.12. (socket-inet.c) Чтение страницы с Web-сервера
#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
/* Отображение содержимого Web-страницы, полученной из
серверного сокета. */
void get_home_page(int socket_fd) {
char buffer[10000];
ssize_t number_characters_read;
/* Отправка HTTP-команды GET с запросом начальной страницы. */
sprintf(buffer, "GET /n");
write(socket_fd, buffer, strlen(buffer));
/* Чтение данных из сокета. Функция read() может вернуть
не все данные сразу, поэтому продолжаем чтение, пока
не будут получены все данные. */
while (1) {
number_characters_read = read(socket_fd, buffer, 10000);
if (number_characters_read == 0)
return;
/* Запись данных в стандартный выходной поток. */
fwrite(buffer, sizeof(char), number_characters_read, stdout);
}
}
int main(int argc, char* const argv[]) {
int socket_fd;
struct sockaddr_in name;
struct hostent* hostinfo;
/* Создание сокета. */
socket_fd = socket(PF_INET, SOCK_STREAM, 0);
/* Запись имени сервера в адресную структуру. */
name.sin_family = AF_INET;
/* Преобразование адреса из текстового представления во
внутреннюю форму. */
hostinfo = gethostbyname(argv[1]);
if (hostinfo == NULL)
return 1;
else
name sin_addr = *((struct in_addr*)hostinfo->h_addr);
/* Web-серверы используют порт 80. */
name.sin_port = htons(80);
/* Подключаемся к Web-серверу. */
if (connect(socket_fd, &name,
sizeof(struct sockaddr_in)) == -1) {
perror("connect");
return 1;
}
/* получаем содержимое начальной страницы сервера. */
get_home_page(socket_fd);
return 0;
}
Программа извлекает имя Web-сервера из командной строки (имя не является URL-адресом, т.е. в нем отсутствует префикс http://
). Далее вызывается функция gethostbyname()
, которая преобразует имя сервера в числовое представление. После этого программа подключает потоковый (TCP) сокет к порту 80 сервера. Web-серверы общаются по протоколу HTTP (Hypertext Transfer Protocol), поэтому программа посылает HTTP-команду GET, в ответ на которую сервер возвращает текст начальной страницы.
- Запуск InterBase-сервера
- Расширенная установка InterBase-сервера
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Информация заголовочной страницы (Database header)
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Статистика InterBase-сервера
- Размер страницы базы данных
- Минимальный состав сервера InterBase SuperServer
- Отличительные особенности сервера Yaffil
- Дополнительные национальные кодовые страницы и порядки сортировки
- Использование сервера Yaffil внутри процесса
- Одновременный запуск нескольких копий сервера (multi-instancing)