5.7. В предположении, что узел сервера поддерживает
linux
(см. рис. 1.7), а затем запустить клиент на узле solaris
, но на стороне клиента задать другой IP-адрес сервера (206.168.112.96). После установления соединения, запустив на стороне сервера программу netstat
, мы увидим, что локальный IP-адрес является IP-адресом получателя из клиентского сегмента SYN, а не IP-адресом канала, на который прибыл сегмент SYN (как отмечалось в разделе 4.4).5.8. Наш клиент был запущен в системе Intel с прямым порядком байтов, где 32-разрядное целое со значением 1 хранится так, как показано на рис. Д.1.
Рис. Д.1
. Представление 32-разрядного целого числа 1 в формате прямого порядка байтовЧетыре байта посылаются на сокет в следующем порядке: A, A + 1, A + 2 и A + 3, и там хранятся в формате обратного порядка байтов, как показано на рис. Д.2.
Рис. Д.2
. Представление 32-разрядного целого числа с рис. Д.1 в формате обратного порядка байтовЗначение 0x01000000
0x02000000
, или 33 554 432. Сумма этих двух целых чисел равна 50 331 648, или 0x03000000
. Когда это значение, записанное в обратном порядке байтов, отправляется клиенту, оно интерпретируется клиентом как целое число 3.Но 32-разрядное целое число -22 представляется в системе с прямым порядком байтов так, как показано на рис. Д.3 (мы предполагаем, что используется поразрядное дополнение до двух для отрицательных чисел).
Рис. Д.3
. Представление 32-разрядного целого числа -22 в формате прямого порядка байтовВ системе с обратным порядком байтов это значение интерпретируется как 0xeaffffff
0xffffffb3
, но в системах с обратным порядком оно представляется как 0xb3ffffff
, или -1 275 068 417. Сложение, выполняемое сервером, приводит к результату 0x9efffffe
, или -1 627 389 954. Полученное значение в обратном порядке байтов посылается через сокет клиенту, где в прямом порядке байтов оно интерпретируется как 0xfeffff9e
, или -16 777 314 — это то значение, которое выводится в нашем примере.5.9. Метод правильный (преобразование двоичных значений в сетевой порядок байтов), но нельзя использовать функции htonl
ntohl
. Хотя символ l
в названиях данных функций обозначает «long», эти функции работают с 32-разрядными целыми (раздел 3.4). В 64-разрядных системах long
занимает 64 бита, и эти две функции работают некорректно. Для решения этой проблемы следует определить две новые функции hton64
и ntoh64
, но они не будут работать в системах, представляющих значения типа long
32 битами.5.10. В первом сценарии сервер будет навсегда блокирован при вызове функции readn
readn
в листинге 5.13, поскольку будет ждать для считывания 64-разрядное значение.5.11. Функция IP-маршрутизации просматривает IP-адрес получателя (IP-адрес сервера) и пытается по таблице маршрутизации определить исходящий интерфейс и следующий маршрутизатор (см. главу 9 [111]). В качестве адреса отправителя используется первичный IP-адрес исходящего интерфейса, если сокет еще не связан с локальным IP-адресом.
Глава 6
6.1. Массив целых чисел содержится внутри структуры, а язык С позволяет использовать со структурами оператор присваивания.
6.2. Если функция select
write
с буфером размером 8193 байта, то функция write
может заблокироваться, ожидая места для последнего байта. Операции считывания на блокируемом сокете будут возвращать сообщение о неполном считывании, если доступны какие-либо данные, но операции записи на блокируемом сокете заблокированы до принятия всех данных ядром. Поэтому, чтобы избежать блокирования при использовании функции select
для проверки на возможность записи, следует переводить сокет в неблокируемый режим.