Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Интерфейс Windows Sockets. Основные функции сервера и клиента. Создание канала связи на стороне сервера и клиента.






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

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

int listen(SOCKET sock, int backlog);

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

Ниже мы привели пример вызов функции 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.

Сторона клиента. Для установки соединения в приложении используется функция SetConnection:

SOCKADDR _IN dest_sin;

void SetConnection(HWND hWnd)

{ PHOSTENT phe;

// Создаем сокет

srv_socket = socket(AF_INET, SOCK_STREAM, 0);

if(srv_socket == INVALID_SOCKET)

{ MessageBox(NULL, " socket Error", " Error", MB_OK);

return; }

// Устанавливаем адрес IP и номер порта

dest_sin.sin_family = AF_INET;

// Определяем адрес узла

phe = gethostbyname (" localhost ");

if(phe == NULL)

{ closesocket (srv_socket);

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

return; }

// Копируем адрес узла

memcpy((char FAR *)& (dest_sin.sin_addr), phe-> h_addr,

phe-> h_length);

// Копируем номер порта

dest_sin.sin_port = htons(SERV_PORT);

// Устанавливаем соединение

if(connect(srv_socket, (PSOCKADDR)& dest_sin,

sizeof(dest_sin)) < 0)

{ closesocket (srv_socket);

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

return; } }






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.