Марк Митчелл - Программирование для Linux. Профессиональный подход

Здесь есть возможность читать онлайн «Марк Митчелл - Программирование для Linux. Профессиональный подход» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2002, ISBN: 2002, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Программирование для Linux. Профессиональный подход: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование для Linux. Профессиональный подход»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.

Программирование для Linux. Профессиональный подход — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Программирование для Linux. Профессиональный подход», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

для приема запросов. */

memset(&socket_address, 0, sizeof(socket_address));

socket_address.sin_family = AF_INET;

socket_address.sin_port = port;

socket_address.sin_addr = local_address;

/* Привязка сокета к этому адресу. */

rval =

bind(server_socket, &socket_address,

sizeof(socket_address));

if (rval != 0)

system_error("bind");

/* Перевод сокета в режим приема запросов. */

rval = listen(server_socket, 10);

if (rval != 0)

system_error("listen");

if (verbose) {

/* В режиме развернутых сообщений отображаем адрес и порт,

с которыми работает сервер. */

socklen_t address_length;

/* Нахождение адреса сокета. */

address_length = sizeof(socket_address);

rval =

getsockname(server_socket, &socket_address, &address_length);

assert(rval == 0);

/* Вывод сообщения. Номер порта должен быть преобразован

из сетевого (обратного) порядка следования байтов

в серверный (прямой). */

printf("server listening on %s:%d\n",

inet_ntoa(socket_address.sin_addr),

(int)ntohs(socket_address.sin_port));

}

/* Бесконечный цикл обработки запросов. */

while (1) {

struct sockaddr_in remote_address;

socklen_t address_length;

int connection;

pid_t child_pid;

/* Прием запроса. Эта функция блокируется до тех пор, пока

не поступит запрос. */

address_length = sizeof(remote_address);

connection = accept(server_socket, &remote_address,

&address_length);

if (connection == -1) {

/* Функция завершилась неудачно. */

if (errno == EINTR)

/* Функция была прервана сигналом. Повторная попытка. */

continue;

else

/* Что-то случилось. */

system_error("accept");

}

/* Соединение установлено. Вывод сообщения, если сервер

работает в режиме развернутых сообщений. */

if (verbose) {

socklen_t address_length;

/* Получение адреса клиента. */

address_length = sizeof(socket_address);

rval =

getpeername(connection, &socket_address, &address_length);

assert(rval == 0);

/* Вывод сообщения. */

printf("connection accepted from %s\n",

inet_ntoa(socket_address.sin_addr));

}

/* Создание дочернего процесса для обработки запроса. */

child_pid = fork();

if (child_pid == 0) {

/* Это дочерний процесс. Потоки stdin и stdout ему не нужны,

поэтому закрываем их. */

close(STDIN_FILENO);

close(STDOUT_FILENO);

/* Дочерний процесс не должен работать с серверным сокетом,

поэтому закрываем его дескриптор. */

close(server_socket);

/* Обработка запроса. */

handle_connection(connection);

/* Обработка завершена. Закрываем соединение и завершаем

дочерний процесс. */

close(connection);

exit(0);

} else if (child_pid > 0) {

/* Это родительский процесс. Дескриптор клиентского сокета

ему не нужен. Переход к приему следующего запроса. */

close(connection);

} else

/* Вызов функции fork() завершился неудачей. */

system_error("fork");

}

}

В файле server.cопределены следующие функции.

■ Функция server_run()является телом сервера. Она запускает сервер и начинает принимать запросы на подключение, не завершаясь до тех пор, пока не произойдет серьезная ошибка. Сервер создает потоковый TCP-сокет (см. раздел 5.5.3, "Серверы").

Первый аргумент функции server_runопределяет локальный адрес, по которому принимаются запросы. У компьютера может быть несколько адресов, каждый из которых соответствует определённому сетевому интерфейсу. [37] В системе могут присутствовать такие интерфейсы, как eth0 (Ethernet-плата), lo (интерфейс обратной связи), ppp0 (коммутируемое соединение). Данный аргумент ограничивает работу сервера конкретным интерфейсом или разрешает принимать запросы отовсюду, если равен INADDR_ANY.

Второй аргумент функции server_run()— это номер порта сервера. Если порт уже используется или является привилегированным, работа сервера завершится. Когда номер порта задан равным нулю. ОС Linux автоматически выберет неиспользуемый порт.

Для обработки каждого клиентского запроса сервер создает дочерний процесс с помощью функции fork()(см. раздел 3.2.2. "Функции fork()и exec()"), в то время как родительский процесс продолжает принимать новые запросы. Дочерний процесс вызывает функцию handle_connection(), после чего закрывает соединение и завершается.

■ Функция handle_connection()обрабатывает отдельный клиентский запрос, принимая в качестве аргумента дескриптор сокета. Функция читает данные из сокета и пытается интерпретировать их как HTTP-запрос на получение страницы.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование для Linux. Профессиональный подход»

Представляем Вашему вниманию похожие книги на «Программирование для Linux. Профессиональный подход» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Программирование для Linux. Профессиональный подход»

Обсуждение, отзывы о книге «Программирование для Linux. Профессиональный подход» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x