Литмир - Электронная Библиотека
Содержание  
A
A

11.10. Когда клиент выводит

Trying 206.62.226.35...
, функция
gethostname
возвращает IP-адрес. Пауза перед этим выводом означает, что распознаватель ищет имя узла. Вывод
Connected to bsdi.unpbook.com.
значит, что функция
connect
возвратила управление. Пауза между этими двумя выводами говорит о том, что функция connect пытается установить соединение.

Глава 12

12.1. Далее приведен сокращенный листинг. Обратите внимание, что клиент FTP в системе

freebsd
всегда пытается использовать команду
EPRT
(независимо от версии IP), но если это не срабатывает, то он пробует команду
PORT
.

freebsd % <b>ftp aix-4</b>

Connected to aix-4.unpbook.com.

220 aix FTP server ...

...

230 Guest login ok. access restrictions apply.

ftp&gt; <b>debug</b>

Debugging on (debug=1).

ftp&gt; <b>passive</b>

Passive mode: off; fallback to active mode= off

ftp&gt; <b>dir</b>

---&gt; EPRT |1|192 168.42.1|50484|

500 'EPRT |1|192.168.42.1|50484|' command not understood.

disabling epsv4 for this connection

---&gt; PORT 192.168.42.1.197.52

200 PORT command successful.

---&gt; LIST

150 Opening ASCII mode data connection for /bin/ls

...

freebsd % <b>ftp ftp.kame.net</b>

Trying 2001.200:0:4819:203:47ff:fea5:3085...

Connected to orange.kame.net.

220 orange.kame.net FTP server ...

...

230 Guest login ok. access restrictions apply.

ftp&gt; <b>debug</b>

Debugging on (debug=1).

ftp&gt; <b>passive</b>

Passive mode: off; fallback to active mode: off.

ftp&gt; <b>dir</b>

---&gt; EPRT |2|3ffe:b80:3:9ad1::2|50480|

200 EPRT command successful

---&gt; LIST

150 Opening ASCII mode data connection for '/bin/ls'.

Глава 13

13.1. Все сообщения об ошибках, даже ошибка загрузки, такая как неправильный аргумент командной строки, должны сохраняться в файлах журнала с помощью функции

syslog
.

13.2. TCP-версии серверов

echo
,
discard
и
chargen
запускаются как дочерние процессы, после того как демон
inetd
вызовет функцию
fork
, поскольку эти три сервера работают, пока клиент не прервет соединение. Два других TCP-сервера,
time
и
daytime
, не требуют использования функции
fork
, поскольку эти службы легко реализовать (получить текущую дату, преобразовать ее, записать и закрыть соединение). Эти два сервера обрабатываются непосредственно демоном
inetd
. Все пять UDP-служб обрабатываются без использования функции
fork
, поскольку каждая из них генерирует единственную дейтаграмму в ответ на клиентскую дейтаграмму, которая запускает эту службу. Эти пять служб обрабатываются напрямую демоном
inetd
.

13.3. Это известная атака типа «отказ в обслуживании» [18]. Первая дейтаграмма с порта 7 заставляет сервер

chargen
отправить дейтаграмму обратно на порт 7. На эту дейтаграмму приходит эхо-ответ, и серверу
chargen
посылается другая дейтаграмма. Происходит зацикливание. Одним из решений, реализованным в системе BSD/OS, является игнорирование дейтаграмм, направленных любому внутреннему серверу, если номер порта отправителя пришедшей дейтаграммы принадлежит одному из внутренних серверов. Другим решением может быть запрещение этих внутренних служб — либо с помощью демона
inetd
на каждом узле, либо на маршрутизаторе, связывающем внутреннюю сеть организации с Интернетом.

13.4. IP-адрес и номер порта клиента могут быть получены из структуры адреса сокета, заполняемой функцией

accept
.

Причина, по которой демон

inetd
не делает этого для UDP-сокета, состоит в том, что чтение дейтаграмм (
recvfrom
) осуществляется с помощью функции
exec
сервером, а не самим демоном
inetd
.

Демон

inetd
может считать дейтаграмму с флагом
MSG_PEEK
(см. раздел 14.7), только чтобы получить IP-адрес и номер порта клиента, но оставляет саму дейтаграмму для чтения серверу.

Глава 14

14.1. Если не установлен обработчик, первый вызов функции

signal
будет возвращать значение
SIG_DFL
, а вызов функции
signal
для восстановления обработчика просто вернет его в исходное состояние.

14.3. Приведем цикл

for
:

for (;;) {

 if ((n = Recv(sockfd, recvline, MAXLINE, MSG_PEEK)) == 0)

  break; /* сервер закрыл соединение */

 Ioctl(sockfd, FIONREAD, &amp;npend);

 printf(&quot;%d bytes from PEEK, %d bytes pending\n&quot;, n, npend);

 n = Read(sockfd, recvline, MAXLINE);

 recvline[n] = 0; /* завершающий нуль */

 Fputs(recvline, stdout);

}

14.4. Данные продолжают выводиться, поскольку выход из функции

main
— это то же самое, что и возврат из этой функции. Функция
main
вызывается программой запуска на языке С следующим образом:

391
{"b":"225366","o":1}