UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
11 cliaddr = Malloc(MAXSOCKADDR);
12 len = MAXSOCKADDR;
13 Getpeername(0, cliaddr, &len);
14 err_msg("connection from %s", Sock_ntop(cliaddr, len));
15 ticks = time(NULL);
16 snprintf(buff, sizeof(buff), "%.24srn", ctime(&ticks));
17 Write(0, buff, strlen(buff));
18 Close(0); /* закрываем соединение TCP */
19 exit(0);
20 }
В программе сделано два важных изменения. Во-первых, исчез весь код создания сокета: вызовы функций
tcp_listen
accept
inetd
for
11-14
tcp_listen
accept
MAXSOCKADDR
getpeername
Чтобы выполнить этот пример в нашей системе Solaris, сначала мы присваиваем службе имя и порт, добавляя следующую строку в
/etc/services
mydaytime 9999/tcp
Затем добавляем строку в
/etc/inetd.conf
mydaytime stream tcp nowait andy
/home/andy/daytimetcpsrv3 daytimetcpsrv3
(Мы разбили длинную строку на более короткие.) Мы помещаем выполняемый код в заданный файл и отправляем демону
inetd
SIGHUP
netstat
solaris % <b>netstat -na | grep 9999</b>
*.9999 *.* 0 0 49152 0 LISTEN
Затем мы запускаем сервер с другого узла:
linux % <b>telnet solaris 9999</b>
Trying 192.168.1.20...
Connected to solaris.
Escape character is '^]'.
Tue Jun 10 11:04:02 2003
Connection closed by foreign host.
Файл
/var/amd/messages
/etc/syslog.conf
facility=LOG_USER
Jun 10 11:04:02 solaris daytimetcpsrv3[28724]: connection from 192.168.1.10.58145
13.7. Резюме
Демоны — это процессы, выполняемые в фоновом режиме независимо от управления с терминалов. Многие сетевые серверы работают как демоны. Все выходные данные демона обычно отправляются демону
syslogd
syslog
Чтобы запустить произвольную программу и выполнять ее в качестве демона, требуется пройти несколько шагов: вызвать функцию
fork
setsid
fork
daemon_init
Многие серверы Unix запускаются демоном
inetd
socket
bind
listen
accept
inetd
Упражнения
1. Что произойдет в листинге 13.2, если мы отложим вызов функции
daemon_init
err_quit
2. Как вы думаете, какие из 10 серверов, перечисленных в табл. 2.1 (учитываются версии TCP и UDP для каждой из пяти служб, управляемых демоном
inetd
3. Что произойдет, если мы создадим сокет UDP, свяжем порт 7 с сокетом (стандартный эхо-сервер в табл. 2.1) и отправим дейтаграмму UDP-серверу
chargen
4. В руководстве Solaris 2.x для демона
inetd
-t
inetd
syslog
facility=LOG_DAEMON
level=LOG_NOTICE
inetd
inetd
В этом же руководстве сказано, что демон
inetd
Есть ли способ обойти эти ограничения для служб UDP?
Глава 14
Дополнительные функции ввода-вывода
14.1. Введение
Эта глава охватывает разнообразные функции и технологии, которые мы помещаем в общую категорию «расширенного ввода-вывода». Сначала мы описываем установку тайм-аута для операции ввода-вывода, которую можно выполнить тремя различными способами. Затем мы рассматриваем три варианта функций
read
write
recv
send
readv
writev
recvmsg
sendmsg