- •3.2. Протокол доставки пользовательских дейтаграмм udp
- •5. Рабочее задание и указание к его выполнению
- •Цель работы
- •Подготовка к работе
- •Стек протоколов tcp/ip
- •3.1. Протокол межсетевого взаимодействия ip, формат ip пакета.
- •3.2. Протокол доставки пользовательских дейтаграмм udp.
- •3.3. Протокол надежной доставки сообщений tcp
- •Программирование по схеме “клиент-сервер” с использованием интерфейса Windows Sockets
- •Int wsaStartup(word wVersionRequested, lpwsadata lpWsaData);
- •Int wsaCleanup(void);
- •Int wsaGetLastError(void);
- •Socket socket(int af, int type, int protocol);
- •Int closesocket(socket sock);
- •Char far * inet_ntoa(struct in_addr in);
- •#Define h_addr h_addr_list[0]
- •Int bind(socket s, const struct sockaddr far *name, int namelen);
- •Int listen(socket sock, int backlog);
- •Socket accept(socket s, struct sockaddr far *addr, int far * addrlen);
- •Void ExitThread(uint fuExitCode);
- •Bool TerminateThread(handle hThread, dword dwExitCode);
- •Connect (socket s, const struct sockaddr *peer, int peer_len);
- •Передача и приём данных.
- •Int sendto(socket s,const void* buf, size_t len, int flags,
- •Int recvfrom(socket s,void* buf,size_t len, int flags,
- •Алгоритм построения клиента и сервера.
- •5. Рабочее задание и указание к его выполнению.
- •Содержание отчёта.
- •Вопросы для самопроверки.
- •8. Библиографический список
Int wsaCleanup(void);
Эта функция может возвратить нулевое значение при успехе или значение SOCKET_ERROR в случае ошибки. Для получения кода последней ошибки, возвращённой Windows Sockets, используется функция:
Int wsaGetLastError(void);
Эта функция позволяет определить код ошибки при неудачном завершении практически всех функций интерфейса Windows Sockets. Её нужно вызывать сразу вслед за функцией, завершившейся неудачно. Если ошибка возникла при выполнении функции WSACleanup, функция WSAGetLastError может вернуть одно из следующих значений:
Значение |
Описание |
WSANOTINITIALISED |
Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup |
WSAENETDOWN |
Сбой сетевого программного обеспечения |
WSAEINPROGRESS |
Во время вызова функции WSACleanup выполнялась одна из блокирующих функций интерфейса Windows Sockets |
Сделаем небольшие пояснения относительно последней ошибки, приведённой в этом списке, имеющей код WSAEINPROGRESS. Некоторые функции интерфейса Windows Sockets способны блокировать работу приложения, так как они не возвращают управление до своего завершения. В операционных системах, использующих вытесняющую мультизадачность, к которым относятся Microsoft Windows 9x/Me, Windows NT4/5, это не приводит к блокировке всей системы. Можно избежать использования блокирующих функций, так как для них в интерфейсе Windows Sockets существует замена.
Создание и инициализация сокета.
После инициализации интерфейса Windows Sockets приложение должно создать один или несколько сокетов, которые будут использованы для передачи данных.
Сокет создаётся с помощью функции:
Socket socket(int af, int type, int protocol);
API сокетов не зависит от протокола и может поддерживать разные адресные домены. Параметр af – это константа, указывающая какой домен нужен сокету (определяет формат адреса). Этому параметру соответствуют домены AF_INET, что соответствует формату адреса, принятому в Internet, AF_LOCAL (или AF_UNIX) и AF_UNSPEC. Домен AF_LOCAL применяется для межпроцессного взаимодействия (IPC) на одной и той же машине. В устаревших вариантах вызова socket константы доменов обозначали как PF_* вместо современных AF_*. Но поскольку оба набора констант определены одинаково – в действительности одни константы просто выражаются через другие, - на практике можно употреблять оба варианта.
Домен AF_UNSPEC применяется в тех случаях, когда спецификация сокета определяется двумя другими параметрами.
Параметры type и protocol определяют соответственно тип сокета и протокол, который будет использован для данного сокета.
Тип сокета |
Описание |
SOCK_STREAM |
Сокет будет использован для передачи данных через канал связи с использованием протокола TCP |
SOCK_DGRAM |
Сокет будет использован для передачи данных без создания канала связи через дейтаграммный протокол UDP |
SOCK_RAW |
Сокет будет использован для доступа к некоторым дейтаграммам на уровне протокола IP. Они используются в особых случаях, например для просмотра всех ICMP сообщений. |
Параметр протокол должен быть определен константами связанными с протоколом, такими как IPPROTO_TCP и IPPROTO_UDP для протоколов TCP и UDP соответственно. Однако при использовании домена AF_INET достаточно указать только тип сокета, а для параметра protocol можно указать нулевое значение.
В случае успеха функция socket возвращает дескриптор, который можно использовать для выполнения всех операций над данным сокетом. Если же произошла ошибка, эта функция возвращает значение INVALID_SOCKET. Для анализа причины ошибки нужно вызвать функцию WSAGetLastError, которая в данном случае может вернуть один из следующих кодов ошибки:
Значение |
Описание |
WSANOTINITIALISED |
Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup |
WSAENETDOWN |
Сбой сетевого программного обеспечения |
WSAEAFNOSUPPORT |
Указан неправильный тип адреса |
WSAEINPROGRESS |
Выполняется блокирующая функция интерфейса Windows Sockets |
WSAEMFILE |
Израсходован весь запас свободных дескрипторов |
WSAENOBUFS |
Нет памяти для создания буфера |
WSAEPROTONOSUPPORT |
Указан неправильный протокол |
WSAEPROTOTYPE |
Указанный протокол несовместим с данным типом сокета |
WSAESOCKTNOSUPPORT |
Указанный тип сокета несовместим с данным типом адреса |
Фрагмент кода, в котором создаётся сокет для передачи данных с использованием протокола TCP:
srv_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (srv_socket == INVALID_SOCKET) { MessageBox(NULL, “socket error”, “error”, MB_OK); return 0; } |
Удаление сокета
Для освобождения ресурсов приложение должно закрывать сокеты, которые ему больше не нужны, вызывая функцию
