Опубликован: 28.09.2007 | Уровень: специалист | Доступ: свободно
Лекция 4:

Сокеты

Программа setsockopt(s, int level, int optname, const char far*optval, int optlen) устанавливает текущие значения опций для сокета s. Аргумент level описывает уровень, на котором определена данная опция (например, SOL_SOCKET или IPPROTO_TCP ); optnameимя опции, значение которой устанавливается, optvalуказатель на буфер, где лежит значение опции, optlen — размер этого буфера. Для опции SO_LINGER — это размер структуры, для остальных — длина целого. При корректном исполнении setsockopt возвращает нуль, в противном случае — SOCKET_ERROR. Программа setsockopt поддерживает следующие опции ( BSD поддерживает и некоторые другие опции; колонка тип соответствует значению optval, таблица 4.2):

Таблица 4.2. Опции сокетов для оператора setsockopt
опция Тип назначение
SOBROADCAST булев Позволяет передачу широковещательных сообщений
SODEBUG булев Осуществляет запись отладочных данных
SO DONTLINGER булев Разрешает закрытие без ожидания при наличии не отосланной информации. Эта опция эквивалентна SO_LINGER с l_onoff=0
SODONTROUTE булев Запрет маршрутизации — отправка непосредственно интерфейсу
SOKEEPALIVE булев Посылка сообщения keepalive ("еще жив")
SO LINGER структура Задержка закрытия в случае наличия не отосланной информации
SOOOBINLINE булев Принимает информацию, приходящую по независимым каналам, в общем потоке данных
SO RCVBUF целый Определяет размер входного буфера
SO REUSEADDR булев Позволяет сокету использовать адрес, который уже задействован
SO SNDBUF целый Определяет размер выходного буфера
TCP NODELAY булев Запрещает использование алгоритма Нагля (TCP).

Программа getsockopt(s, int level, int optname, char far*optval, int FAR* optlen) позволяет получить значение опции для любого типа сокетов. Значения параметров обращения аналогичны setsockopt. Ниже представлена таблица 4.3 поддерживаемых опций.

В среде Windows существуют аналоги (асинхронные) многих из приведенных выше операторов. Имена этих операторов имеют префикс WSA (Windows Socket Asynchronous). Асинхронными они названы по той причине, что их выполнение сопряжено с определенным диалогом и ни начало, ни завершение не ограничено какими-либо временными рамками. Список таких операторов представлен в таблицах 4.4 и 4.5 (версия windows socket 2.2).

Таблица 4.3. Опции сокетов для оператора getsockopt
опция Тип назначение
SO ACCEPTCONN булев Сокет в режиме listen
SOBROADCAST булев Разрешена передача широковещательных сообщений
SO DEBUG булев Отладочный режим разрешен
SO DONTLINGER булев Если равен TRUE, SOLINGER-опция запрещена
SO DONTROUTE булев Запрет маршрутизации
SO ERROR целое Выдает статус ошибок
SOKEEPALIVE булев Сообщение keepalive ("еще жив") послано
SO LINGER структура Возвращает текущие значения опции SO_LINGER
SOOOBINLINE булев Принимает информацию, приходящую по независимым каналам, в общем потоке данных
SO RCVBUF целый Сообщает размер входного буфера
SO REUSEADDR булев Сокету разрешено использовать адрес, который был задействован
SO SNDBUF целый Сообщает размер выходного буфера
SOTYPE целый Тип сокета (например, SOCK_ STREAM )
TCP NODELAY булев Использование алгоритма Нагля запрещено (tcp)

Из этого списка можно выделить две программы WSAStartup и WSACleanup, первая вызывается в начале любой процедуры, вторая — ее завершает. WSAStartup может вызываться за время сессии несколько раз, она позволяет указать версию winsock или получить информацию о ее конкретной реализации. При вызове WSAStartup осуществляется диалог с динамической библиотекой WINSOCK.DLL и настройка параметров системы. При аварийном завершении программы нужно корректно окончить работу с WINSOCK.DLL. Следует при этом помнить, что WSACleanup воздействует на все потоки завершаемого процесса (например, в случае Windows). Определенные проблемы может вызвать перенос программ из Unix в Windows, так как там вместо read и write используются операторы recv и send, вместо ioctlioctlsocket, а вместо closeclosesocket. Некоторые операторы вообще непереносимы: readv, writv, recvmsg и sendmsg и части программы, где они содержатся, необходимо переписать. При обнаружении ошибки Unix присваивает переменной errno соответствующее значение. В winsock для этой цели используется символьная константа SOCKET_ERROR (равная 1), а для уточнения типа ошибки следует вызвать WSAGetLastError. В системе Windows этот оператор обращается к программе Win32 GetLastError, которая возвращает значение ошибки для сессии, вызвавшей эту ошибку.

Таблица 4.4. Основные операторы winsock
Имя оператора назначение
WSAAsyncGetHostByAddr Аналог оператора gethostbyaddr
WSAAsyncGetHostByName Аналог оператора gethostbyname
WSAAsyncGetProtoByName Аналог оператора getprotobyname
WSAAsyncGetProtoByNumber Аналог оператора getprotobynumber
WSAAsyncGetServByName Аналог оператора getservbyname
WSAAsyncGetServByPort Аналог оператора getservbyport
WSAAsyncSelect Функциональный аналог оператора select
WSACancelAsyncRequest Прерывает выполнение операторов типа WSAAsyncgetХbyY
WSACancelBlockingCall Прерывает выполнение блокирующего оператора приложения (API)
WSACleanup Сообщает Windows sockets о завершении работы программы с DLL
WSAGetLastError Выдает сообщение о последней ошибке
WSAIsBlocking Определяет, является ли библиотека Winsock DLL блокирующей
WSASetBlockingHook Устанавливает перехват блокирующего вызова
WSASet LastError Фиксирует тип ошибки для последующего вызова WSALastError
WSAStartup Инициализирует следующий уровень Winsock
WSAUNhookBlockingHook Восстанавливает прежнюю блокировку.
Таблица 4.5. Асинхронные операторы
WSAAccept* Расширенная версия accept, которая разрешает условное подключение и формирование групп сокетов
WSACloseEvent Уничтожает объект события
WSAConnect* Расширенная версия connect, которая позволяет обмениваться данными о соединении и QoS-информацией.
WSACreateEvent Создает объект события
WSADuplicateSocket Создает новый дескриптор сокета для случая использования его несколькими процессами
WSAEnumNetworkEvents Выявляет сетевые события
WSAEnumProtocols Выдает информацию о каждом доступном протоколе
WSAEventSelect Связывает сетевое событие с объектом события
WSAGetOverlappedResult Сообщает состояние выполнения совместной операции обмена
WSAGetQOSByName Выдает параметры QOS для заданного имени сетевой услуги
WSAHtonl Расширенная версия htonl
WSAHtons Расширенная версия htons
WSAIoctl* Версия ioctlsocket, пригодная для совмещения процедур ввода/вывода
WSAJoinLeaf* Подключает периферийный узел к многоточечной сессии
WSANtohl Расширенная версия ntohl
WSANtohs Расширенная версия ntohs
WSARecv* Расширенная версия recv, которая позволяет совмещать во времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей и получать флаги в качестве входных и выходных параметров
WSARecvDisconnect Завершает работу сокета и выдает информацию о завершении, если сокет был ориентирован на работу в связанном состоянии
WSARecvErom* Расширенная версия recvfrom, которая позволяет совмещать по времени операции ввода/ вывода, использовать многобуферную схему при работе с векторами указателей и получать флаги в качестве входных и выходных параметров
WSAresetevent Обнуляет объект события
WSASend* Расширенная версия send, которая позволяет совмещать по времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей
WSASendDisconnect Инициализирует процедуру закрытия соединения и опционно посылает сообщение disconnect
WSASendTo* Расширенная версия sendto, которая позволяет совмещать по времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей
WSASetevent Устанавливает объект события
WSASocket Расширенная версия socket, которая использует структуру WSAPROTOCOL_INFO в качестве входной информации и позволяет создать сокеты, работающие одновременно. Позволяет также формировать группы сокетов
WSAWaitForMultiple Events Присылается, если любой или все специфицированные объекты находятся в сигнальном состоянии или когда истекает время тайм-аута
* Программа может вызвать блокировку при работе с блокирующим соке-том.
Каролина Попович
Каролина Попович
Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Сергей Смоляр
Сергей Смоляр
Россия, Ялта