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