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

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.
Описание книги "Программирование для Linux. Профессиональный подход"
Описание и краткое содержание "Программирование для Linux. Профессиональный подход" читать бесплатно онлайн.
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
% ./socket-client /tmp/socket "Hello, world."
% ./socket-client /tmp/socket "This is a test."
Сервер получит и отобразит эти сообщения. Чтобы закрыть сервер, пошлите ему сообщение "quit":
% ./socket-client /tmp/socket "quit"
5.5.6. Internet-сокеты
UNIX-сокеты используются для организации взаимодействия двух процессов, выполняющихся на одном компьютере. С другой стороны. Internet-сокеты позволяют соединять между собой процессы, работающие на разных компьютерах.
Пространству имен Internet соответствует константа PF_INET. Internet-сокеты чаще всего работают по протоколам TCP/IP. Протокол IP (Internet Protocol) отвечает за низкоуровневую доставку сообщений, осуществляя при необходимости их разбивку на пакеты и последующую компоновку. Доставка пакетов не гарантируется, поэтому они могут исчезать или приходить в неправильном порядке. Каждый компьютер в сети имеет свой IP-адрес. Протокол TCP (Transmission Control Protocol) функционирует поверх протокола IP и обеспечивает надежную доставку сообщений, ориентированную на установление соединений.
DNS-именаЛегче запоминать имена а не числа, поэтому служба DNS (Domain Name Service) закрепляет за IP-адресами доменные имена вида www.codesourcery.com. Служба DNS организована в виде всемирной иерархии серверов имен. Чтобы использовать доменные имена в программах, нет необходимости разбираться в протоколах DNS
Адрес Internet-сокета состоит из двух частей: адреса компьютера и номера порта. Эта информация хранится в структуре типа sockaddr_in. В поле sin_family необходимо записать константу AF_INET, указывающую на то, что адрес принадлежит пространству имен Internet. В поле sin_addr хранится IP-адрес компьютера в виде 32-разрядного целого числа. Благодаря номерам портов можно различать сокеты, создаваемые на одном компьютере. В разных системах многобайтовые значения могут храниться с разным порядком следования байтов, поэтому с помощью функции htons() необходимо преобразовать номер порта в число с сетевым порядком следования байтов.
Функция gethostbyname() преобразует адрес компьютера из текстового представления — стандартного точечного (например, 10.10.10.1) или доменного (например, www.codesourcery.com) — во внутреннее 32-разрядное. Функция возвращает указатель на структуру типа hostent. IP-адрес находится в ее поле h_addr.
Программа, представленная в листинге 5.12, иллюстрирует работу с Internet-сокетами. Программа запрашивает начальную страницу у 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, в ответ на которую сервер возвращает текст начальной страницы.
Стандартные номера портовПо существующему соглашению Web-серверы ожидают поступления запросов на порт 80. За большинством lntemet-сервисов закреплены стандартные номера портов. Например, защищенные Web-серверы работающие по протоколу SSL. прослушивают порт 443 а почтовые серверы (протокол SMTP) прослушивают порт 25
В Linux связи между именами протоколов/сервисов и номерами портов устанавливаются в файле /etc/services. В первой колонке файла указано имя протокола или сервисе. Во второй колонке приведен номер порта и тип взаимодействия: tcp — для сервисов ориентированных на соединения, и udp — для дейтаграмм.
При реализации собственных сетевых сервисов используйте номере портов, большие чем 1024
Например, чтобы получить начальную страницу с сервера www.codesourcery.com, введите следующую команду:
% ./socket-inet www.codesourcery.com
<html>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
...
5.5.7. Пары сокетов
Как было показано выше, функция pipe() создает два дескриптора для входного и выходного концов канала. Возможности каналов ограничены, так как с файловыми дескрипторами должны работать связанные процессы и данные через канал передаются только в одном направлении. Функция socketpair() создает два дескриптора для двух связанных сокетов, находящихся на одном компьютере. С помощью этих дескрипторов можно организовать двунаправленное взаимодействие процессов.
Первые три параметра функции socketpair() такие же, как и в функции socket(): пространство имен (должно быть PF_LOCAL), тип взаимодействия и протокол. Последний параметр — это массив из двух целых чисел, куда будут записаны дескрипторы сокетов, подобно функции pipe().
Часть II
Секреты Linux
Глава 6
Устройства
Linux, как и большинство операционных систем, взаимодействует с аппаратными устройствами посредством модульных программных компонентов, называемых драйверами. Драйвер скрывает от операционной системы детали взаимодействия с устройством и предоставляет в распоряжение системы стандартный интерфейс обращения к устройству.
В Linux драйверы устройств являются частью ядра и могут подключаться к ядру статически либо по запросу в виде модулей. Драйверы недоступны напрямую пользовательским процессам. Но в Linux имеется особый механизм — специальные файловые объекты, позволяющие процессам взаимодействовать с драйверами, а через них — с аппаратными устройствами. Такие объекты являются частью операционной системы, поэтому программы могут открывать их, читать из них данные и осуществлять запись в них точно так же, как если бы это быта обычные файлы. С помощью низкоуровневых вызовов (описаны в приложении Б, "Низкоуровневый ввод-вывод") или стандартных библиотечных функций ввода-вывода программы могут обмениваться данными с устройствами через файловые объекты
В Linux есть также ряд файловых объектов, предназначенных для доступа к ядру, а не к драйверам устройств. Такие объекты не связаны с аппаратными устройствами. Они реализуют специальные функции, используемые приложениями и системными программами.
Будьте осторожны при доступе к устройствам!Описанные в этой главе методики позволяют непосредственно взаимодействовать с драйверами устройств, работающими в ядра Linux, а через них — с аппаратными устройствами, подключенными к системе. Применить эти методики следует осторожно, чтобы не нарушить работоспособность системы
6.1. Типы устройств
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Программирование для Linux. Профессиональный подход"
Книги похожие на "Программирование для Linux. Профессиональный подход" читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "Марк Митчелл - Программирование для Linux. Профессиональный подход"
Отзывы читателей о книге "Программирование для Linux. Профессиональный подход", комментарии и мнения людей о произведении.