Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

10.3. Адресация

Чтобы процессы могли связаться по сети, должен существовать механизм определения сетевого адреса (network address) компьютера, на котором находится другой процесс. В конечном счете адрес определяет физическое положение компьютера в сети. Обычно адреса состоят из нескольких частей, соответствующих различным уровням сети. Далее будут затронуты только те вопросы, без ответов на которые не обойтись при программировании с использованием сокетов.

10.3.1. Адресация Internet

Сейчас почти во всех глобальных сетях применима адресация IP (сокращение от Internet Protocol – межсетевой протокол, протокол сети Интернет).

Адрес IP состоит из четырех десятичных чисел, разделенных точками, например:

197.124.10.1

Эти четыре числа содержат достаточную информацию для определения сети назначения, а также компьютера в этой сети; собственно, термин Internet и означает «сеть сетей».

Сетевые вызовы UNIX не могут работать с IP адресами в таком формате. На программном уровне IP адреса хранятся в структуре типа in_addr_t. Обычно программистам не нужно знать внутреннее представление этого типа, так как для преобразования IP адреса в структуру типа in_addr_t предназначена процедура inet_addr.

Описание

uses stdio;

function inet_addr(ip_address:pchar):in_addr_t;

Процедура inet_addr принимает IP адрес в форме строки вида 1.2.3.4 и возвращает адрес в виде структуры соответствующего типа. Если вызов процедуры завершается неудачей из-за неверного формата IP адреса, то возвращаемое значение будет равно in_addr_t(-1), например:

var

server:in_addr_t;

server := inet_addr('197.124.10.1');

Для того чтобы процесс мог ссылаться на адрес своего компьютера, в заголовочном файле stdio определена постоянная INADDR_ANY, содержащая локальный адрес компьютера в формате in_addr_t.

10.3.2. Порты

Кроме адреса компьютера, клиентская программа должна иметь возможность подключения к нужному серверному процессу. Серверный процесс ждет подключения к заданному номеру порта (port number). Поэтому клиентский процесс должен выполнить запрос на подключение к определенному порту на заданном компьютере. Если продолжить аналогию с пересылкой писем по почте, то это равносильно дополнению адреса номером комнаты или квартиры.

Некоторые номера портов по соглашению считаются отведенными для стандартных сервисов, таких как ftp или rlogin. Эти номера портов записаны в файле /etc/services. В общем случае порты с номерами, меньшими 1024, считаются зарезервированными для системных процессов UNIX. Все остальные порты доступны для пользовательских процессов.

10.4. Интерфейс сокетов

Для хранения информации об адресе и порте адресата (абонента) существуют стандартные структуры. Обобщенная структура адреса сокета определяется в модуле sockets следующим образом:

TSockAddr=packed Record

family:word; (* Семейство адресов *)

data :array [0..13] of char; (* Адрес сокета *)

end;

Эта структура называется обобщенным сокетом (generic socket), так как в действительности применяются различные типы сокетов в зависимости от того, используются ли они в качестве средства межпроцессного взаимодействия на одном и том же компьютере или для связи процессов через сеть. Сокеты для связи через сеть имеют следующую форму:

uses sockets;

TInetSockAddr = packed Record

family : Word; (* Семейство адресов *)

port : Word; (* Номер порта *)

addr : Cardinal; (* IP-адрес *)

pad : array [1..8] of byte; (* Поле выравнивания *)

end;

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal