2 способа передачи данных:
- посылка пакетов без получения подтверждений и проверки целостости
+ быстродействие, возможность посылки широковещательных сообщений
используется упорядочение датаграмм, что приводит к падению производительности
Для передачи сообщений приложение должно создать сокет.
Сокеты являются начальной и конечной точкой соединения.
Для сосздания сетевых приложений в среде Microsoft Visual Studio используется библиотека Winsock2.
Winsock2 поддерживает 2 вида сокетов:
Типы сокетов:
Потоковые сокеты устанавливают канал, идентифицируют партнера, проверяют целостность данных и факт доставки. Используют протокол TCP.
Датаграммные сокеты производят отсылку/прием безо всяких проверок, зато делают это быстро. Используют протокол UDP.
Сырые сокеты, используя нижние уровни стека протоколов TCP/IP, позволяют вручную формировать пакеты произвольного формата (например, пакеты протокола ICPM).
#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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.