Шрифт:
Таблица 8.2. Сокеты TCP и UDP: может ли быть задан адрес протокола получателя
Тип сокета | write или send | sendto, без указания получателя | sendto, с указанием получателя |
---|---|---|---|
Сокет TCP | Да | Да | EISCONN |
Сокет UDP, присоединенный | Да | Да | EISCONN |
Сокет UDP, неприсоединенный | EDESTADDRREQ | EDESTADDRREQ | Да |
POSIX определяет, что операция вывода, не задающая адрес получателя на неприсоединенном сокете UDP, должна возвращать ошибку ENOTCONN, а не EDESTADDRREQ.
Solaris 2.5 допускает функцию sendto, которая задает адрес получателя для присоединенного сокета UDP. POSIX определяет, что в такой ситуации должна возвращаться ошибка EISCONN.
На рис. 8.7 обобщается информация о присоединенном сокете UDP.
Рис. 8.7. Присоединенный сокет UDP
Приложение вызывает функцию
Дейтаграммы, приходящие с любого другого IP-адреса или порта (который мы обозначаем как «???» на рис. 8.7), не передаются на присоединенный сокет, поскольку либо IP-адрес, либо UDP-порт отправителя не совпадают с адресом протокола, с которым сокет соединяется с помощью функции
Обобщая вышесказанное, мы можем утверждать, что клиент или сервер UDP может вызвать функцию
Еще один пример долгосрочного взаимодействия — это DNS (рис. 8.8).
Рис. 8.8. Пример клиентов и серверов DNS и функции connect
Клиент DNS может быть сконфигурирован для использования одного или более серверов, обычно с помощью перечисления IP-адресов серверов в файле
Многократный вызов функции connect для сокета UDP
Процесс с присоединенным сокетом UDP может снова вызвать функцию
задать новый IP-адрес и порт;
отсоединить сокет.
Первый случай, задание нового собеседника для присоединенного сокета UDP, отличается от использования функции
Чтобы отсоединить сокет UDP, мы вызываем функцию
В руководстве BSD по поводу функции connect традиционно говорилось: «Сокеты дейтаграмм могут разрывать связь, соединяясь с недействительными адресами, такими как пустые адреса». К сожалению, ни в одном руководстве не сказано, что представляет собой «пустой адрес», и не упоминается, что в результате возвращается ошибка (что нормально). Стандарт POSIX явно указывает, что семейство адресов должно быть установлено в AF_UNSPEC, но затем сообщает, что этот вызов функции connect может возвратить, а может и не возвратить ошибку EAFNOSUPPORT.
Производительность
Когда приложение вызывает функцию
присоединение сокета;
вывод первой дейтаграммы;