Winsock: AF_INET или AF_INET6
От: Optimus1  
Дата: 10.06.21 11:57
Оценка:
Здравствуйте,

Подскажите пожалуйста, какое правило нужно соблюдаться при создании сокета?

Стоит ли создавать сокет типа AF_INET, если провайдер дает мне ipv4?

Или

Нужно создавать сокет типа AF_INET6, если провайдер дает мне ipv6?

Если да, то как программно определить, какую версию ip выдает мой провайдер?


PS: AF_UNSPEC — не рекомендуется использовать из-за уязвимости.
Отредактировано 10.06.2021 12:01 Optimus1 . Предыдущая версия .
c++ winsock winsock2
Re: Winsock: AF_INET или AF_INET6
От: watchmaker  
Дата: 10.06.21 16:35
Оценка:
Здравствуйте, Optimus1, Вы писали:


O>Стоит ли создавать сокет типа AF_INET, если провайдер дает мне ipv4?

O>Нужно создавать сокет типа AF_INET6, если провайдер дает мне ipv6?

Кто же кроме тебя знать должен ответ на этот вопрос? Если протокол нужен — то создавай. Если не нужен — то не создавай.



Если не важны сами ip-адреса, а нужно лишь уметь принимать соединения или самому к чему-то подсоединяться, преобразовывать имена в ip и обратно, и логировать всё это дело, то для этого достаточно использовать dual-stack сокеты — а ОС сама разберётся как и по какому протоколу подключаться.


O>Если да, то как программно определить, какую версию ip выдает мой провайдер?


Лучше сразу делать действия и обрабатывать ошибки, а не предсказывать наперёд. Даже если есть соответствующий адрес, то связь может не работать и по другим причинам. Так что без обработки ошибок программа всё равно стабильно работать не будет, и её придётся делать.
Re[2]: Winsock: AF_INET или AF_INET6
От: Optimus1  
Дата: 10.06.21 17:00
Оценка:
Здравствуйте, watchmaker, Вы писали:


W>Кто же кроме тебя знать должен ответ на этот вопрос? Если протокол нужен — то создавай. Если не нужен — то не создавай.


Что значит "кто ж кроме меня" ?

Разве это какой индивидуальный вопрос или частный случай ?


Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP, все мое НЕПОНИМАНИЕ находится в диапазоне между двух параметров: это создание сокета с параметром AF_INET или AF_INET6.

Ну то есть к примеру: есть провайдер, он дает мне выдает ip версии v4. Теперь я хочу просто послать обычный запрос на сервер, для этого я должен узнать IP сервера и создать сокет.

Вопрос, каким правило я должен руководствоваться при выборе параметра AF_INET или AF_INET6 при создании сокета ?
ть.
Re[3]: Winsock: AF_INET или AF_INET6
От: watchmaker  
Дата: 10.06.21 17:44
Оценка: +1
Здравствуйте, Optimus1, Вы писали:


O>Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP,


Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.


Если у тебя нет ip-адреса, но есть, например, имя хоста, к которому нужно подключится, то ты вызываешь getaddrinfo и получаешь адреса. Дальше поступаешь ровно так, как написано выше. Тут простора для выбора ещё меньше — функция просто возвращает все необходимые значения аргументов.
Re[4]: Winsock: AF_INET или AF_INET6
От: Optimus1  
Дата: 10.06.21 17:55
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Optimus1, Вы писали:



O>>Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP,


W>Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.


То есть, если есть IP адрес, то версия протокола IP по которому работает провайдер не имеет значения ?
Re[5]: Winsock: AF_INET или AF_INET6
От: watchmaker  
Дата: 10.06.21 18:29
Оценка: +1
Здравствуйте, Optimus1, Вы писали:

O>>>Ну то есть для примера: предположим мне нужно создать клиентский сокет, то есть для подключения к серверу по TCP,


W>>Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.


O>То есть, если есть IP адрес, то версия протокола IP по которому работает провайдер не имеет значения ?


Разумеется, успешность соединения будет зависеть от настроек сети провайдера и его возможностей. В этом смысле, отличие будет.
Но, во-первых, ты не имеешь никаких шансов из свой программы перестроить сеть провайдера — это не софтвараная проблема.
Во-вторых, соединение может не состояться по многими причинам, и обычно нет резона выделять эту как-то отдельно.
Re[6]: Winsock: AF_INET или AF_INET6
От: Optimus1  
Дата: 10.06.21 18:44
Оценка:
W>Разумеется, успешность соединения будет зависеть от настроек сети провайдера и его возможностей. В этом смысле, отличие будет.
W>Но, во-первых, ты не имеешь никаких шансов из свой программы перестроить сеть провайдера — это не софтвараная проблема.
W>Во-вторых, соединение может не состояться по многими причинам, и обычно нет резона выделять эту как-то отдельно.

Понял, спасибо!
Re[4]: Winsock: AF_INET или AF_INET6
От: Anton Batenev Россия https://github.com/abbat
Дата: 11.06.21 09:19
Оценка:
Здравствуйте, watchmaker, Вы писали:

w> Чтобы подключится к серверу тебе нужно иметь его адрес. Если он у тебя есть и это IPv4 адрес, то нужен IPv4 сокет. Если это IPv6 адрес, то нужен IPv6 сокет. Тут всё максимально прямолинейно — никаких трюков.


Ну не совсем Иногда (точнее уже достаточно часто) бывает так, что у хоста есть и IPv4 адрес и IPv6 адрес, а у тебя локально может быть любая комбинация (IPv4-only, IPv6-only, dual-stack). При этом локально может быть такая конфигурация, что например поддержка IPv4 (или IPv6) носит формальный характер — т.е. на интерфейсе адрес вроде есть, попытаться отправить через него что-то можно, но это гарантированный таймаут или другая сетевая ошибка.

Большинство современных браузеров, например, применяют (как минимум применяли ранее, сейчас не знаю) разные эвристики и кэшируют успешные маршруты.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.