UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
12-18
strncpy
sun_path
bind
SUN_LEN
getsockname
Если мы запустим программу в Solaris, то получим следующие результаты:
solaris % <b>umask</b> <i>сначала выводим наше значение umask</i>
022 <i>оно отображается в восьмеричной системе</i>
solaris % <b>unixbind /tmp/moose</b>
bound name = /tmp/moose, returned len = 13
solaris % <b>unixbind /tmp/moose</b> <i>снова запускаем программу</i>
bound name = /tmp/moose, returned len = 13
solaris % <b>ls -l /tmp/moose</b>
srwxr-xr-x 1 andy staff 0 Aug 10 13:13 /tmp/moose
solaris % <b>ls -lF /tmp/foo.bar</b>
srwxr-xr-x 1 andy staff 0 Aug 10 13:13 /tmp/moose=
Сначала мы выводим наше значение
umask
getsockname
sun_len
sun_family
%s
printf
sun_path
unlink
Мы запускаем команду
ls -l
umask
ls
-F
Изначально значение umask не действовало на создаваемые процессами доменные сокеты Unix, но с течением времени производители исправили это упущение, чтобы устанавливаемые разрешения соответствовали ожиданиям разработчиков. Тем не менее все еще существуют системы, в которых разрешения доменного сокета могут не зависеть от значения umask. В других системах сокеты могут отображаться как каналы (символ р), а значок равенства при вызове ls -F может не отображаться вовсе. Однако поведение, демонстрируемое в нашем примере, является наиболее типичным.
15.3. Функция socketpair
Функция
socketpair
#include <sys/socket.h>
int socketpair(int <i>family</i>, int <i>type</i>, int <i>protocol</i>, int <i>sockfd</i>[2]);
<i>Возвращает: ненулевое значение в случае успешного выполнения, -1 в случае ошибки</i>
Аргумент
family
AF_LOCAL
protocol
SOCK_STREAM
SOCK_DGRAM
sockfd[0]
sockfd[1]
Эта функция аналогична функции Unix pipe: при ее вызове возвращаются два дескриптора, причем каждый дескриптор соединен с другим. Действительно, в Беркли-реализации внутреннее устройство функции pipe полностью аналогично функции socketpair [112, с. 253-254].
Два созданных сокета не имеют имен. Это значит, что не было неявного вызова функции
bind
Результат выполнения функции
socketpair
SOCK_STREAM
pipe
socketpair
POSIX не требует поддержки двусторонних каналов. В SVR4 функция pipe возвращает два двусторонних дескриптора, в то время как ядра, происходящие от Беркли, традиционно возвращают односторонние дескрипторы (см. рис. 17.31 [112]).
15.4. Функции сокетов
Функции сокетов применяются к доменным сокетам Unix с учетом некоторых особенностей и ограничений. Далее мы перечисляем требования POSIX, указывая, где они применимы. Отметим, что на сегодняшний день не все реализации соответствуют этим требованиям.
1. Права доступа к файлу по умолчанию для полного имени, созданного функцией
bind
umask
2. Имя, связанное с доменным сокетом Unix, должно быть абсолютным, а не относительным именем. Причина, по которой нужно избегать относительного имени, в том, что в таком случае разрешение имени зависит от текущего рабочего каталога вызывающего процесса. То есть если сервер связывается с относительным именем, клиент должен находиться в том же каталоге, что и сервер (или должен знать этот каталог), для того чтобы вызов клиентом функции
connect
sendto