UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В POSIX сказано, что связывание относительного имени с доменным сокетом Unix приводит к непредсказуемым результатам.
3. Полное имя, заданное в вызове функции
connect4. С функцией
connect5. Потоковые доменные сокеты Unix аналогичны сокетам TCP: они предоставляют интерфейс байтового потока без границ записей.
6. Если при вызове функции connect для потокового доменного сокета Unix обнаруживается, что очередь прослушиваемого сокета переполнена (см. раздел 4.5), немедленно возвращается ошибка
ECONNREFUSED7. Дейтаграммные доменные сокеты Unix аналогичны сокетам UDP: они предоставляют ненадежный сервис дейтаграмм, сохраняющий границы записей.
8. В отличие от сокетов UDP, при отправке дейтаграммы на неприсоединенный дейтаграммный доменный сокет Unix с сокетом не связывается полное имя. (Вспомните, что отправка дейтаграммы UDP на неприсоединенный сокет UDP заставляет динамически назначаемый порт связываться с сокетом.) Это означает, что получатель дейтаграммы не будет иметь возможности отправить ответ, если отправитель не связал со своим сокетом полное имя. Аналогично, в отличие от TCP и UDP, при вызове функции
connect15.5. Клиент и сервер потокового доменного протокола Unix
Теперь мы перепишем наш эхо-клиент и эхо-сервер TCP из главы 5 с использованием доменных сокетов Unix. В листинге 15.3 показан сервер, который является модификацией сервера из листинга 5.9 и использует потоковый доменный протокол Unix вместо протокола TCP.
Листинг 15.3. Эхо-сервер потокового доменного протокола Unix
//unixdomain/unixstrserv01.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int listenfd, connfd; 6 pid_t childpid; 7 socklen_t clilen; 8 struct sockaddr_un cliaddr, servaddr; 9 void sig_chld(int);10 listenfd = Socket(AF_LOCAL, SOCK_STREAM, 0);11 unlink(UNIXSTR_PATH);12 bzero(&servaddr, sizeof(servaddr));13 servaddr.sun_family = AF_LOCAL;14 strcpy(servaddr.sun_path, UNIXSTR_PATH);15 Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));16 Listen(listenfd, LISTENQ);17 Signal(SIGCHLD, sig_chld);18 for (;;) {19 clilen = sizeof(cliaddr);20 if ((connfd = accept(listenfd, (SA*)&cliaddr, &clilen)) < 0) {21 if (errno == EINTR)22 continue; /* назад в for() */23 else24 err_sys("accept error");25 }26 if ((childpid = Fork()) == 0) { /* дочерний процесс */27 Close(listenfd); /* закрывается прослушиваемый сокет */28 str_echo(connfd); /* обработка запроса */29 exit(0);30 }31 Close(connfd); /* родитель закрывает присоединенный сокет */32 }33 }8sockaddr_un10AF_LOCAL11-15UNIXSTR_PATHunp.h/tmp/unix/strunlinkbindunlinkОбратите внимание, что этот вызов функции
bindsockaddr_unОставшаяся часть функции такая же, как и в листинге 5.9. Используется та же функция
str_echoВ листинге 15.4 представлен эхо-клиент потокового доменного протокола Unix. Это модификация листинга 5.3.
Листинг 15.4. Эхо-клиент потокового доменного протокола Unix
//unixdomain/umxstrcli01.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int sockfd; 6 struct sockaddr_un servaddr;
