русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Сторона сервера


Дата добавления: 2013-12-23; просмотров: 1187; Нарушение авторских прав


Пары сокетов

Как упоминалось ранее, функция pipe , создает два дескриптора файлов для начала и конца канала. Каналы ограничены, потому что дескрипторы файлов используются только связанными процессами и потому что взаимодействие однонаправлено. Функция socketpair создает два дескриптора файлов для двух сокетов, подключенных на одном компьютере. Эти дескрипторы файлов разрешают двухстороннее взаимодействие двух связанных процессов. Первые три параметра команды - идентичны параметрам команды socket : они определяют домен, стиль подключения и протокол. Последний параметр - массив с двумя целыми числами, в котором хранятся характеристики файлов этих двух сокетов. При использовании команды socketpair , необходимо определить PF_LOCAL как пространство имен.

 

 

38 создание канала связи

Если вы собираетесь передавать датаграммные сообщения при помощи протокола негарантированной доставки UDP , канал связи не нужен. Сразу после создания сокетов и их инициализации можно приступать к передаче данных. Но для передачи данных с использованием протокола TCP необходимо создать канал связи.

Рассмотрим процедуру создания канала связи со стороны сервера.

Прежде всего вы должны переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции listen:

int listen(SOCKET sock, int backlog);

Через параметр sock функции необходимо передать дескриптор сокета, который будет использован для создания канала. Параметр backlog задает максимальный размер очереди для ожидания соединения (можно указывать значения от 1 до 5). Очередь содержит запросы на установку соединений для каждой пары значений (адрес IP, порт).

Ниже мы привели список возможных кодов ошибок для функции listen.

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEADDRINUSE Указанный адрес уже используется
WSAEINPROGRESS Выполняется блокирующая функция интерфейсаWindows Sockets
WSAEINVAL Сокет еще не был привязан к адресу или уже находится в подключенном состоянии
WSAEISCONN Сокет уже находится в подключенном состоянии
WSAEMFILE Недостаточно дескрипторов файлов
WSAENOBUFS Нет места для размещения буфера
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPP Функция listen не работает с сокетом указанного типа

Ниже мы привели пример вызов функции listen:



if(listen(srv_socket , 1) == SOCKET_ERROR )

{

closesocket (srv_socket);

MessageBox(NULL, "listen Error", "Error", MB_OK);

return;

}

Далее необходимо выполнить ожидание соединения. Это можно выполнить двумя различными способами.

Первый способ заключается в циклическом вызове функции accept до тех пор, пока не будет установлено соединение. Затем можно будет приступать к обмену данными.

Функция accept имеет следующий прототип:

SOCKET accept (SOCKET sock, struct sockaddr FAR * addr,

int FAR * addrlen);

Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания.

Параметр addr должен содержать адрес буфера, в который будет записан адрес узла, подключившегося к серверу. Размер этого буфера необходимо указать в переменной типа int, адрес которой передается через параметр addrlen.

Если ожидание соединения в цикле не вызывает у вас особого энтузиазма, можно предложить более удобный способ, основанный на использовании расширения программного интерфейса Windows Socket, предназначенного для выполнения асинхронных операций.

Приведем список возможных кодов ошибок для функции accept.

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEFAULT Значение параметраaddrlen меньше размера структуры адреса
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейсаWindows Sockets
WSAEINVAL Перед вызовом функции accept не была вызывана функция listen
WSAEMFILE Нет доступных дескрипторов
WSAENOBUFS Установлено слишком много соединений
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPP Данный тип сокета нельзя использовать при вызове функций, ориентированных на работу с каналом связи
WSAEWOULDBLOCK Сокет отмечен как неблокирующий и в настоящее время нет каналов связи, которые нужно устанавливать

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

#define WSA_ACCEPT (WM_USER + 1)

// При попытке установки соединения главное окно приложения

// получит сообщение WSA_ACCEPT

rc = WSAAsyncSelect (srv_socket , hWnd, WSA_ACCEPT, FD_ACCEPT );

if(rc > 0)

{

closesocket (srv_socket);

MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK);

return;

}

В данном случае ожидание соединения выполняется для сокета srv_socket . Последний параметр функции имеет значение FD_ACCEPT . Это означает, что при попытке создания канала связи функция окна с идентификатором hWnd получит сообщение WSA_ACCEPT, определенное в вашем приложении.

Обработчик этого сообщения может выглядеть, например, следующим образом:

void WndProc_OnWSAAccept(HWND hWnd, UINT msg,

WPARAM wParam, LPARAM lParam)

{

int rc;

 

// При ошибке отменяем поступление извещений

// в главное окно приложения

if(WSAGETSELECTERROR(lParam) != 0)

{

MessageBox(NULL, "accept Error", "Error", MB_OK);

WSAAsyncSelect (srv_socket , hWnd, 0, 0);

return;

}

 

// Определяем размер адреса сокета

acc_sin_len = sizeof(acc_sin);

 

// Разрешаем установку соединения

srv_socket = accept (srv_socket, (LPSOCKADDR )&acc_sin,

(int FAR *)&acc_sin_len);

 

if(srv_socket == INVALID_SOCKET)

{

MessageBox(NULL, "accept Error, invalid socket ",

"Error", MB_OK);

return;

}

 

// Если на данном сокете начнется передача данных от

// клиента, в главное окно приложения поступит

// сообщение WSA_NETEVENT.

// Это же сообщение поступит при разрыве соединения

rc = WSAAsyncSelect (srv_socket , hWnd, WSA_NETEVENT,

FD_READ | FD_CLOSE );

if(rc > 0)

{

closesocket (srv_socket);

MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK);

return;

}

}

В данном случае обработчик сообщения вначале вызывает функцию accept , выполняющую создание канала передачи данных. После этого функция WSAAsyncSelect вызывается еще один раз для того чтобы установить асинхронную обработку приема данных от удаленного клиента, а также обработку ситуации разрыва канала связи.



<== предыдущая лекция | следующая лекция ==>
Internet-Domain сокеты | Сторона клиента


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.