ПАРАМЕТРЫ СОКЕТА Методическое пособие по дисциплине «Программное обеспечение компьютерных сетей и информационных систем»
Перед использованием сокета необходимо задать его параметры, для чего следует подготовить структуру типа sockaddr, определение которой помещено ниже
Для работы с адресами в формате InterNet используется другой вариант этой структуры, в котором детализируется формат поля sa_data
Поле sin_family Поле sin_family определяет тип адреса. Следует записать в это поле значение AF_INET, которое соответствует типу адреса, принятому в InterNet (структура srv_address имеет тип SOCKADDR_IN) srv_address.sin_family = AF_INET;
Поле sin_port Поле sin_port определяет номер порта, который будет использоваться для передачи данных. Порт - это просто идентификатор программы, выполняющей обмен по сети. На одном узле может одновременно работать несколько программ, использующих разные порты.
Особенностью поля sin_port Особенностью поля sin_port является использование так называемого сетевого формата данных. Этот формат отличается от того, что принят в процессорах с архитектурой Intel, а именно - младшие байты данных хранятся по старшим адресам памяти (архитектура процессоров Intel подразумевает хранение старших байтов данных по младшим адресам).
Cетевой формат Cетевой формат данных удобен при организации глобальных сетей, так как в узлах такой сети могут использоваться компьютеры с различной архитектурой.
Специальный набор функций интерфейса Windows Socket Для выполнения преобразований из обычного формата в сетевой и обратно в интерфейсе Windows Socket интерфейсе Windows Socket предусмотрен специальный набор функций. В частности, для заполнения поля sin_port нужно использовать функцию htons, выполняющую преобразование 16-разрядных данных из формата Intel в сетевой формат.
Инициализация поля sin_port в приложении SERVER Ниже показано, как инициализируется поле sin_port в приложении SERVER
Поле sin_addr структуры sockaddr_in представляет собой структуру in_addr
Инициализация сокета При инициализации сокета в этой структуре следует указать адрес IР (32- битовое уникальное число, идентифицирующее данный компьютер, с которым будет работать данный сокет. Если сокет будет работать с любым адресом (например, создается сервер, который будет доступен из узлов с любым адресом).
Адрес для сокета может быть указан следующим образом srv_address.sin_addr.s_addr = INADDR_ANY;
В том случае, если сокет будет работать с определенным IP-адресом (например, создается приложение- клиент, которое будет обращаться к серверу с конкретным адресом IP), в указанную структуру необходимо записать реальный IP-адрес.
Датаграммный протокол UDP позволяет посылать пакеты данных одновременно всем рабочим станциям в широковещательном режиме. Для этого необходимо указать адрес как INADDR_BROADCAST.
Если известен адрес в виде четырех десятичных чисел, разделенных точкой (именно так его может вводить пользователь), то можно заполнить поле адреса при помощи функции inet_addr (структура dest_sin имеет тип SOCKADDR_IN) dest_sin.sin_addr.s_addr = inet_addr(" ");
В случае ошибки В случае ошибки функция возвращает значение INADDR_NONE, что и следует использовать для проверки.
Обратное преобразование адреса IP в текстовую строку Обратное преобразование адреса IP в текстовую строку можно при необходимости легко выполнить с помощью функции inet_ntoa, имеющий следующий прототип char FAR * inet_ntoa(struct in_addr in); При ошибке эта функция возвращает NULL.
Работа с доменными именами, применяя сервер DNS или файл HOSTS Однако чаще всего пользователь работает с доменными именами, применяя сервер DNS или файл HOSTS В этом случае следует воспользоваться функцией gethostbyname, возвращающей адрес IP, а затем записать полученный адрес в структуру sin_addr
В случае ошибки функция gethostbyname возвращает NULL, после чего причину ошибку можно выяснить путем проверки кода возврата функцией WSAGetLastError.
Если указанный адрес найден в базе DNS или файле HOSTS (см. подраздел 7.1.1), функция gethostbyname возвращает указатель на структуру hostent, описанную ниже
Искомый адрес Искомый адрес находится в первом элементе списка h_addr_list[0], на который можно также ссылаться при помощи h_addr, длина поля адреса находится в поле h_length.
ПРИВЯЗКА АДРЕСА К СОКЕТУ После подготовки структуры SOCKADDR (записи в нее параметров сокета - в частности, адреса) следует привязку адреса к сокету при помощи функции bind int bind(SOCKET sock, const struct sockaddr FAR *addr, int namelen);
Параметр sock содержит дескриптор созданного ранее функцией socket сокета, в поле addr следует записать указатель на подготовленную структуру SOCKADDR, в поле namelen - размер этой структуры.
В случае ошибки функция bind возвращает значение SOCKET_ERROR, дальнейший анализ причин ошибок следует выполнять при помощи функции WSAGetLastError, возможные коды ошибок перечислены ниже
Пример вызова функции bind показан ниже
Литература 1. Чепмен Д. и др. Разработка InterNet-приложений в DELPHI 2. -Киев.:DiaSoft, c. 2. Елманова Н.З. Borland C++Builder (архитектура клиент/сервер, многозвенные системы, InterNet- приложения). -M.: Диалог-МИФИ, c. 3. Зайцев С.С. Описание и реализация протоколов сетей ЭВМ. -М.: Наука, c. 4. Клейнрок Л. Вычислительные системы с очередями. Пер. с англ. -М.: Мир, c. 5. Фролов А.В., Фролов Г.В. Локальные сети персональных компьютеров(монтаж сети, установка программного обеспечения). Библиотека системного программиста, т.7. M.: Диалог-МИФИ, c.