![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Интерфейс 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; } }
|