В настоящее время я пишу библиотеку C, в которой используются сетевые структуры, такие как sockaddr
. В моем коде я использую это тернарное условие, чтобы вывести размер такой структуры.struct sockaddr, нам действительно нужно дать addrlen
addrlen = sourceaddr->sa_family ==
AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
Однако, большинство стандартных функций UNIX, такие как bind
имеет такую подпись:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Он содержит четкое указание длины адреса addrlen
.
Мой вопрос: «Зачем мне нужно явное указание адреса len в моей библиотеке, если я могу вывести его с помощью sa_family
?»
Например, вызов привязки может изменить к этой подписи:
int bind(int sockfd, const struct sockaddr *addr);
И использовать внутренне:
__bind(sockfd, addr,
addr->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
Большое спасибо
Обратная совместимость. И если вы измените подпись своей функции 'bind', то вы перестанете соответствовать требованиям POSIX (если вы этого хотите) или совместимы с любой другой функцией' bind'. –
Хорошо. Это означает, что в предыдущей структуре sockaddr не было поля sa_family? Итак, что бы вы посоветовали для недавней библиотеки: используйте или не addrlen? Спасибо :) –