Шрифт:
До сих пор мы демонстрировали серверы TCP, создающие один прослушиваемый сокет, и серверы UDP, создающие один сокет дейтаграмм. Это тот вариант, который подразумевался в предыдущем абзаце. Альтернативным устройством является сервер, который обрабатывает множество сокетов с помощью функции
Проблема этой технологии состоит в том, что условие, по которому функция getaddrinfo возвращает множество структур, возникает, когда служба может обрабатываться как протоколом IPv4, так и протоколом IPv6 (см. табл. 11.3). Но эти два протокола не полностью независимы, как мы увидели в разделе 10.2, то есть если мы создаем прослушиваемый сокет IPv6 для данного порта, нет необходимости создавать для него прослушиваемый сокет IPv4, поскольку соединения, приходящие от клиентов IPv4, автоматически обрабатываются стеком протоколов и прослушиваемым сокетом IPv6, при условии, что параметр сокета IPV6_V6ONLY не установлен.
Невзирая на тот факт, что функция
Функция
11.7. Функция gai_strerror
Ненулевые значения ошибок, возвращаемых функцией
Таблица 11.2. Ненулевые возвращаемые значения (константы) ошибок функции getaddrinfo
Константа | Описание |
---|---|
EAI_AGAIN | Временный сбой при попытке разрешения имен |
EAI_BADFLAGS | Недопустимое значение ai_flags |
EAI_FAIL | Неисправимая ошибка при разрешении имен |
EAI_FAMILY | Семейство ai_family не поддерживается |
EAI_MEMORY | Ошибка при выделении памяти |
EAI_NONAME | Имя узла или имя службы неизвестны или равны NULL |
EAI_OVERFLOW | Переполнен буфер пользовательских аргументов (только для getnameinfo) |
EAI_SERVICE | Запрошенная служба не поддерживается для данного типа сокета ai_socktype |
EAI_SOCKTYPE | Тип сокета ai_socktype не поддерживается |
EAI_SYSTEM | Другая системная ошибка, возвращаемая в переменной errno |
11.8. Функция freeaddrinfo
Вся память, занимаемая структурами
Переменная
Предположим, что мы вызываем функцию
Создание копии только самой структуры addrinfo, а не структур, на которые она, в свою очередь, указывает, называется поверхностным копированием (shallow сору). Копирование структуры addrinfo и всех структур, на которые она указывает, называется детальным копированием (deep сору).
11.9. Функция getaddrinfo: IPv6
Стандарт POSIX определяет как