- •1. Сокеты, датаграммы и каналы связи
- •2. Инициализация приложения при работе с сокетами и завершение его работы
- •3. Создание и инициализация сокета
- •3.1. Создание сокета
- •3.2. Удаление сокета
- •3.3. Параметры сокета
- •3.4. Привязка адреса к сокету
- •3.5. Создание канала связи
- •3.5.1.Сторона сервера
- •3.5.1. Сторона клиента
- •3.5.3. Передача и прием данных
- •4. Решения при работе с сокетами
- •5. Порядок выполнения работы
- •6. Контрольные вопросы
- •Приложения
- •1. Коды ошибок различных функций при работе с сокетами
- •2. Сервер сокетов с оконным интерфейсом (протокол tcp/ip).
- •3. Клиент сокетов с оконным интерфейсом (протокол tcp/ip).
- •4. Сервер сокетов с оконным интерфейсом (протокол udp).
- •5. Клиент сокетов с оконным интерфейсом (протокол udp).
- •6. Сервер неблокирующих сокетов с использованием события wsaevent (протокол tcp/ip)
- •7. Клиент неблокирующих сокетов с использованием события wsaevent (протокол tcp/ip)
- •8. Сервер неблокирующих сокетов с использованием функции select
- •9.Клиент неблокирующих сокетов с использованием функции select
- •10. Сервер блокируюющих сокетов (протокол tcp/ip)
- •11. Клиент блокируюющих сокетов (протокол tcp/ip)
4. Решения при работе с сокетами
В случае, если приложение не имеет окна, могут применяться другие решения для построения приложений на сокетах.
Неблокирующие сокеты на событиях WSAEVENT.
Создается событие WSAEVENT
Вызывается функция WSAEventSelect, которая связывает событие с сокетом и указывает на какие операции событие будет реагировать (соединение, чтение, запись, закрытие).
Вызывается функция WSAWaitForMultipleEvents, которая ожидает установки события при готовности к определенной операции.
Вызывается функция WSAEnumNetworkEvents для определения какую операцию можно произвести с сокетом.
В данном случае используются функции Winsocket версии 2.0. поэтому необходимо подключать заголовочный файл winsock2.h и библиотеку ws2_32.lib. (причем заголовочный файл windows.h в этом случае подключать не следует).
Неблокирующие сокеты с использованием функции select.
Объявляется множество сокетов fd_set.
В множество добавляется сокет, установленный на прослушивание – макрос FD_SET.
Проверяется множество сокетов – функция select. Функция select маркирует в множестве те сокеты, которые готовы к выполнению какой-либо операции.
С помощью макроса FD_ISSET проверяется конкретный сокет, входящий в множество.
Неблокирующие сокеты с использованием структуры OVERLAPPED.
Используется асинхронный ввод – вывод через сокеты с помощью структуры OVERLAPPED.
Для ассоциации структуры с сокетом используется функция - WSIOCTL
Примечание: для демонстрационных целей приведен пример с блокирующими сокетами (см. Приложение 10). Клиент соединяется с сервером, отправляет сообщение, получает ответ и закрывает сокет. Сервер создает сокет, прослушивает сокет в ожидании соединения клиента, принимает соединение, принимает сообщение от клиента, отправляет ответ клиенту и закрывает соединение. Рекомендуется для рассмотрения в первую очередь для наилучшего понимания последовательности действий клиента и сервера.
Примечание: при использовании сокетов версии 1.1 необходимо подключать заголовочный файл winsock.h и библиотеку wsock32.lib. В случае, если используются функции Winsocket версии 2.0. поэтому необходимо подключать заголовочный файл winsock2.h и библиотеку ws2_32.lib. (причем заголовочный файл windows.h в этом случае подключать не следует).
Сокеты, работающие на основе протокола UDP в отличие от сокетов, работающих на протоколе TCP/IP не создают канал связи и не гарантируют доставку. Причем пакеты, отправленные позже, могут придти на другую сторону раньше. Программист сам несет ответственность за сбор пакетов (см. пример программы в приложении 4).
5. Порядок выполнения работы
Рассмотреть и протестировать работу программ в приложениях, начиная с блокирующих сокетов. Разобрать в работе программ. Модернизировать сервера и клиента так, чтобы передавалось не одно сообщение.
Разаработать клиент - серверное приложение. Сервер - консольное приложение (возможно служба). Клиент – оконное приложение. Клиенты подсоединяются к серверу. Сервер извещает уже подсоединившихся клиентов о каждом подсоединении к нему нового клиента, а также отсоединении «старых» клиентов. При соединении клиент передает серверу свое имя. Предусмотреть в интерфейсе клиента передачу сообщений заданному по имени клиенту, а также широковешательную передачу всем клиентам. Сервер выводит сообщения на консоль или в лог файл (в случае службы) о подключении/ отключении клиентов о передаче сообщений.