O>Стоит ли создавать сокет типа AF_INET, если провайдер дает мне ipv4? O>Нужно создавать сокет типа AF_INET6, если провайдер дает мне ipv6?
Кто же кроме тебя знать должен ответ на этот вопрос? Если протокол нужен — то создавай. Если не нужен — то не создавай.
Если не важны сами ip-адреса, а нужно лишь уметь принимать соединения или самому к чему-то подсоединяться, преобразовывать имена в ip и обратно, и логировать всё это дело, то для этого достаточно использовать dual-stack сокеты — а ОС сама разберётся как и по какому протоколу подключаться.
O>Если да, то как программно определить, какую версию ip выдает мой провайдер?
Лучше сразу делать действия и обрабатывать ошибки, а не предсказывать наперёд. Даже если есть соответствующий адрес, то связь может не работать и по другим причинам. Так что без обработки ошибок программа всё равно стабильно работать не будет, и её придётся делать.
W>Кто же кроме тебя знать должен ответ на этот вопрос? Если протокол нужен — то создавай. Если не нужен — то не создавай.
Что значит "кто ж кроме меня" ?
Разве это какой индивидуальный вопрос или частный случай ?
Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP, все мое НЕПОНИМАНИЕ находится в диапазоне между двух параметров: это создание сокета с параметром AF_INET или AF_INET6.
Ну то есть к примеру: есть провайдер, он дает мне выдает ip версии v4. Теперь я хочу просто послать обычный запрос на сервер, для этого я должен узнать IP сервера и создать сокет.
Вопрос, каким правило я должен руководствоваться при выборе параметра AF_INET или AF_INET6 при создании сокета ?
ть.
O>Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP,
Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.
Если у тебя нет ip-адреса, но есть, например, имя хоста, к которому нужно подключится, то ты вызываешь getaddrinfo и получаешь адреса. Дальше поступаешь ровно так, как написано выше. Тут простора для выбора ещё меньше — функция просто возвращает все необходимые значения аргументов.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, Optimus1, Вы писали:
O>>Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP,
W>Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.
То есть, если есть IP адрес, то версия протокола IP по которому работает провайдер не имеет значения ?
Здравствуйте, Optimus1, Вы писали:
O>>>Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP,
W>>Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.
O>То есть, если есть IP адрес, то версия протокола IP по которому работает провайдер не имеет значения ?
Разумеется, успешность соединения будет зависеть от настроек сети провайдера и его возможностей. В этом смысле, отличие будет.
Но, во-первых, ты не имеешь никаких шансов из свой программы перестроить сеть провайдера — это не софтвараная проблема.
Во-вторых, соединение может не состояться по многими причинам, и обычно нет резона выделять эту как-то отдельно.
W>Разумеется, успешность соединения будет зависеть от настроек сети провайдера и его возможностей. В этом смысле, отличие будет. W>Но, во-первых, ты не имеешь никаких шансов из свой программы перестроить сеть провайдера — это не софтвараная проблема. W>Во-вторых, соединение может не состояться по многими причинам, и обычно нет резона выделять эту как-то отдельно.
Здравствуйте, watchmaker, Вы писали:
w> Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.
Ну не совсем Иногда (точнее уже достаточно часто) бывает так, что у хоста есть и IPv4 адрес и IPv6 адрес, а у тебя локально может быть любая комбинация (IPv4-only, IPv6-only, dual-stack). При этом локально может быть такая конфигурация, что например поддержка IPv4 (или IPv6) носит формальный характер — т.е. на интерфейсе адрес вроде есть, попытаться отправить через него что-то можно, но это гарантированный таймаут или другая сетевая ошибка.
Большинство современных браузеров, например, применяют (как минимум применяли ранее, сейчас не знаю) разные эвристики и кэшируют успешные маршруты.