Протоколы без предварительного установления соединения При использовании дейтаграммных сокетов сначала создают сокет функцией socket или WSASocket. Затем выполняют привязку сокета к интерфейсу, на котором будут принимать данные, функцией bind (как и в случае протоколов, ориентированных на сеансы). Разница в том, что вместо вызова listen или accept нужно просто ожидать приема входящих данных. Поскольку в этом случае соединения нет, принимающий сокет может получать дейтаграммы от любой машины в сети. Простейшая функция приема — recvform: int recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); Первые четыре параметра такие же, как и для функции recv. Параметр from — структура SOCKADDR для данного протокола слушающего сокета, на размер структуры адреса ссылается fromlen. После возврата вызова структура SOCKADDR будет содержать адрес рабочей станции, которая отправляет данные. В Winsock 2 применяется другая версия recvform — WSARecvForm. Другой способ приема (отправки) данных в сокетах, не требующих соединения, — установление соединения (хоть это и звучит странно). После создания сокета можно вызвать connect или WSAConnect, присвоив параметpy SOCKADDR адрес удаленного компьютера, с которым необходимо связаться. Фактически никакого соединения не происходит. Адрес сокета, переданный в функцию соединения, ассоциируется с сокетом, чтобы было можно использовать функции recv и WSARecv вместо recvfrom или WSARecvFrom (поскольку источник данных известен). Есть два способа отправки данных через сокет, не требующий соединения. Первый и самый простой — создать сокет и вызвать функцию sendto или WSASendTo. Рассмотрим функцию sendto: int sendto( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); Параметры этой функции такие же, как и у recvfrom, за исключением buf— буфера данных для отправки, и len — показывающего сколько байт отправлять. Параметр to — указатель на структуру SOCKADDR с адресом принимающей рабочей станции. Также можно использовать функцию WSASendTo из Winsock 2: Как и при получении данных, сокет, не требующий соединения, можно подключать к адресу конечной точки и отправлять данные функциями send и WSASend. После создания этой привязки использовать для обмена данными функции sendto или WSASendTo с другим адресом нельзя — будет выдана ошибка. Отменить привязку сокета можно, лишь вызвав функцию closesocket с описателем этого сокета, после чего следует создать новый сокет. Поскольку соединение не устанавливается, его формального разрыва или корректного закрытия не требуется. После прекращения отправки или получения данных отправителем или получателем просто вызывается функция closesocket с описателем требуемого сокета, в результате чего освобождаются все выделенные ему ресурсы. Порядок выполнения работы Задание 1. Разработать TCP-сервер, создающий сокет, привязывающий его к локальному IP-адресу и порту и прослушивающий соединения клиентов. Номер порта и IP-адрес вводить с клавиатуры. IP-адрес задавать в десятично-точечной нотации. Учесть, что функция accept возвращает новый дескриптор сокета, соответствующий принятому клиентскому соединению. Для всех последующих операций с данным клиентским соединением должен применяться новый сокет. Исходный прослушивающий сокет используется для приема других клиентских соединений и продолжает находиться в режиме прослушивания. При получении от клиента запроса на установление соединения вывести на экран IP-адрес и номер порта клиентского сокета. Разработать приложение–клиент, соединяющееся с заданным TCP-сервером. Все отправленные и полученные по сокету данные вывести на экран. При вызове API-функций выполнять проверку и обработку ошибок. Нарисовать блок-схему серверной и клиентской части программы. Задание 2. Разработать серверное приложение, выполняющее получение данных через сокет без установления соединения по протоколу UDP. Разработать клиентское приложение, выполняющее отправку UDP-дейтаграмм. IP-адрес и порт удаленного получателя должен задаваться пользователем. При вызове API-функций выполнять проверку и обработку ошибок. Адреса сокетов вывести на экран. Нарисовать блок-схему серверной и клиентской части программы. Варианты заданий: 1) Удаленный калькулятор (+,-,*,/); 2) Работа с массивом чисел (количество элементов в массиве, получение значения элемента массива по номеру, найти номер элемента в массиве по значению, увеличить значения элементов на заданное число); 3) Работа с массивом символов (преобразовать символы в верхний регистр, в нижний регистр, проверить, является ли символ цифрой, буквой, получить значение элемента массива); 4) Удаленный однострочный редактор (вставка символа в позицию, в конец строки, удаление символа из позиции); 5) Редактор для работы с двумя строками (конкатенация строк, проверка на равенство строк, проверка на равенство длин, вставка второй строки в заданную позицию первой); 6) Удаленный генератор псевдослучайных последовательностей (одно целое число в диапазоне, массив чисел в диапазоне). При разработке программ использовать функции Windows API или класс Socket пространства имен System.Net .NET Framework. В качестве языков программирования - C++, либо C#. Контрольные вопросы 1. Что такое сокет? Какая версия Winsock используется на платформе Win32? 2. Сколько сокетов необходимо для взаимодействия клиента и сервера? Что представляет собой адрес сокета? 3. Назовите типы сокетов. В каком случае предпочтительнее использовать тот или иной тип сокетов? 4. Какой адрес можно использовать, чтобы прослушивать все сетевые интерфейсы локального узла? 5. Какой порядок байтов используется в Intel-совместимых процессорах? Какой порядок байтов применяется для работы с сокетами? 6. Какие номера портов могут задействовать прикладные программы при работе с сокетами? 7. Какая функция позволяет узнать номера портов, используемых стандартными службами? В каком файле хранится эта информация? 8. Чем отличается процесс получения и отправки данных на сокете, не требующем соединения? 9. Как осуществляется корректное завершение сеанса работы с сокетом? В чем отличие завершения работы с потоковым и дейтаграммным сокетом? |