Системный вызов сокета Bind In c - PullRequest
2 голосов
/ 31 мая 2011

В одном из интервью меня спросили, почему необходимо вычислять размер адреса, с которым он связан в системном вызове bind.

bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))

Значит, я хотел бы знать, для чего нужен третий аргумент в системном вызове bind ??

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Поскольку структура sockaddr более или менее служит "базовой" структурой для "производных" структур, таких как sockaddr_in. Это почти механизм наследования.

sockaddr содержит данные переменной длины, которые могут использоваться «производными» структурами, такими как sockaddr_*, поэтому вам необходимо точно определить эффективный размер «производной» структуры.

1 голос
/ 31 мая 2011

Это проверка.Информация о типе не передается в функцию, поэтому она использует размер для проверки того, что структура, скорее всего, имеет правильный тип или, по крайней мере, достаточно большой, чтобы не записывать в недопустимую память.

Это также форма проверки на будущее: если более поздняя версия структуры имеет больше полей и вынуждает структуру увеличиваться в размере, принимающий вызов может различать старые / новые и заполнять только объем данных, не беспокоясь описать вне границ.

1 голос
/ 31 мая 2011

C-вызовам обычно требуется размер данных, которые передаются им в качестве параметров, и это все, что делает структура, в противном случае при чтении данных из структуры внутренняя функция может попытаться прочитать за пределами структуры, и мы оба знаем, что это плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...