UNIX: разработка сетевых приложений, стр. 169
В 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;