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

Оглавление книги


Генерация: 1.286. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз