Основы сетевой передачи данных. Работа с сокетами. Обработка запросов от нескольких клиентов

Страницы работы

Содержание работы

Основы сетевой передачи данных.

2 способа передачи данных:

  • датаграммный

- посылка пакетов без получения подтверждений и проверки целостости

+ быстродействие, возможность посылки широковещательных сообщений

  • канальный

используется упорядочение датаграмм, что приводит к падению производительности

Для передачи сообщений приложение должно создать сокет.

Сокеты являются начальной и конечной точкой соединения.

Для сосздания сетевых приложений в среде Microsoft Visual Studio используется библиотека Winsock2.

Winsock2 поддерживает 2 вида сокетов:

  • Синхронный (захватывает управление процессом)
  • Асинхронный (работает в фоне)

Типы сокетов:

  • Потоковые
  • Датаграммные
  • Сырые

Потоковые сокеты устанавливают канал, идентифицируют партнера, проверяют целостность данных и факт доставки. Используют протокол TCP.

Датаграммные сокеты производят отсылку/прием безо всяких проверок, зато делают это быстро. Используют протокол UDP.

Сырые сокеты, используя нижние уровни стека протоколов TCP/IP, позволяют вручную формировать пакеты произвольного формата (например, пакеты протокола ICPM).

Работа с сокетами.

  1. Инициализация работы библиотеки
  2. Созданеи сокета, привязка к адресу
  3. Установка связи
  4. Передача данных
  5. Закрытие сокета, остановка библиотеки.

Начало работы.

#include <winsock2.h>

#pragma comment(lib,"WS2_32.lib")

Подключение библиотеки работы с сокетами.

#define PORT 23

#define SERVERADDR “127.0.0.1”

При выполнении лабораторной работы Вам будет достаточно задваать адрес и номер порта константами. В общем случае они могут задаваться как константами, так и переменными. Принципиально здеь то, что номер порта – это целове число, а адрес – строка определенного формата (формат IP-адреса – 4 целых числа, не превышающих 28, разделенных точками ).

Инициализация работы библиотеки происходит по вызову функции WSAStartup:

WSAStartup(Ver, &WSAData);

Здесь Ver – номер версии Windows Sockets в шестнадцатеричном формате (например, 0x202 – Windows Sockets версии 2.2, 0x200 – версии 2.0). Если номер установленной версии библиотеки меньше, чем требует значение Ver, WSAStartup выдаст ошибку версии.

WSAData – объект типа WSADATA, программа вносит в эту переменную данные о системе, параметрах библиотеки и другую техническую информацию.

В случае ошибки WSAStartup возвращает ненулевое значение. Код ошибки можно получить функцией WSAGetLastError() . Ошибки могут возникать из-за ошибок установок самой библиотеки, либо из-за несовпадения требуемой версии библиотеки и установленной в системе.

Создание сокета.

socket(int af, int type, int protocol);

Возвращает дескриптор сокета (тип SOCKET, возможно использование как целого числа).

af = AF_INET – идентификатор типа соединения. В виду того, что мы работаем в сетях типа Internet, его значение может быть только таким.

type – определяет тип сокета. Может иметь значения SOCK_STREAM (потоковое соединение), SOCK_DGRAMM  (датаграммное), SOCK_RAW (сырой сокет).

protocol – определяет используемый протокол. Может быть нулевым (значение по умолчанию,  TCP для потоковых соединений, UDP для датаграммных). Допустимые значения в компиляторе Microsoft IPPROTO_TCP и IPPROTO_UDP. В компиляторе Borland эти же константы имеют вид TCP и UDP соответственно.

В случае ошибки создания сокета возвращает -1.

Установка соединения.

С точки зрения программиста заключается в заполнении структуры типа sockaddr_in .

Структура типа sockaddr_in имеет следующие поля:

               int sin_family – тип соединения, аналогичен параметру af функции socket.

               int sin_port – номер порта. В виду того, что при установке соединения используется байтовый формат номера порта, для заполнения используется функция htons, которая переводит число, не превышающее65535, в байтовый формат:

               dest_addr.sin_port = htons(port);

               struct in_addr sin_addr – структура, в которой сохраняется сетевой адрес. Необходимо заполнить ее поле s_addr, в котором сохраняется 32-битный числовой адрес.

               dest_addr.sin_addr.s_addr = inet_addr(string);

Здесь под string понимается строка вида "ххх.ххх.ххх.ххх", где ххх – число, не превышающее 255.

Если адрес задан не в числовом формате, а в видесимвольного адреса (например, "site.domen.ru"), то необходимо обратиться к серверу доменных имен (DNS) для получения адреса в байтовом формате. Делается это посредством функции gethostbyname(string), которая возвращает структуру типа HOSTENT. Структура типа HOSTENT содержит следующие поля:

               char* hname – основное имя узла;

               char** h_aliases – дополнительные имена узла;

               int h_addrtype – тип соединения, опять AF_INET;

Похожие материалы

Информация о работе

Предмет:
Информатика
Тип:
Методические указания и пособия
Размер файла:
66 Kb
Скачали:
0