Подтвердить что ты не робот

Почему мы вызываем sockaddr_in в sockaddr при вызове bind()?

Функция bind() принимает указатель на sockaddr, но во всех примерах, которые я видел, вместо этого используется структура sockaddr_in, и добавляется к sockaddr:

struct sockaddr_in name;
...
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
...

Я не могу окунуться в голову, почему используется структура sockaddr_in. Почему бы не просто подготовить и передать sockaddr?

Это просто соглашение?

4b9b3361

Ответ 1

Нет, это не просто соглашение.

sockaddr является общим дескриптором для любого типа операции сокета, тогда как sockaddr_in является структурой, специфичной для связи на основе IP (IIRC, "in" означает "InterNet" ). Насколько я знаю, это своего рода "полиморфизм": функция bind() делает вид, что принимает struct sockaddr *, но на самом деле будет предполагать, что соответствующий тип структуры передан; я. е. тот, который соответствует типу сокета, который вы даете ему в качестве первого аргумента.

Ответ 2

Это связано с тем, что bind cans связывает другие типы сокетов, чем сокеты IP, например сокеты домена Unix, которые имеют sockaddr_un как их тип. Адрес для сокета AF_INET имеет хост и порт в качестве их адреса, тогда как сокет AF_UNIX имеет путь к файловой системе.