LINUX.ORG.RU

Как связаны AF и PF?

 


0

1

Допустим я откуда-то получил struct sockaddr *sa и хочу туда подключиться. В нем у меня из понятного есть только sa_family, то есть AF. connect(2) требует сокет, а socket(2) в свою очередь требует PF.

1. Как в общем получить PF из AF? Про их численное равенство почти на всех платформах знаю, но хочу расовый путь, хотя и подозреваю, что эти фэмили и не подразумевались быть связанными, но исторически не сложилось. Забить на это и сделать socket(sa->sa_family, SOCK_STREAM, 0) — уже сделано.

2. Я так понимаю, что dns-сервер может возвращать записи для всех PF/AF, сам находясь лишь в одной. Отдает ли он на низком уровне полный набор (PF, AF, type, proto) для заданного сервиса, или так же по-тупому отдает только AF+data?

Если ты имеешь в виду константы типа AF_INET и PF_INET, то в linux это одно и то же.

grondek
()

Есть такая функция, как getaddrinfo. Она возвращает не только sockaddr, но еще и параметры для socket.

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

Это все понятно, не первый день в сокетах. Интересен именно момент, как оформить вызов socket(), имея лишь абстрактный хз откуда прилетевший sockaddr, т.е. не залезая в детали sa_family. Ответ, что в общем виде нельзя, тоже устроит, сейчас опираюсь на нестандартную идентичность AF/PF.

arturpub ★★
() автор топика
Ответ на: комментарий от grondek

Я и так знаю, что SOCK_STREAM и 0. Если комбинация вдруг невозможна, socket() вернет EPROTONOSUPPORT или EPROTOTYPE.

Вообще, чем больше думаю об этом, тем больше понимаю, что вопрос тупняк, а решение — ограничиться тремя доменами и не делать мозг.

arturpub ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.