доказательства того, что они полезны - только не для вас.
моего предыдущеговопросМне действительно интересно этот код -
case AF_INET:
{
struct sockaddr_in * tmp =
reinterpret_cast<struct sockaddr_in *> (&addrStruct);
tmp->sin_family = AF_INET;
tmp->sin_port = htons(port);
inet_pton(AF_INET, addr, tmp->sin_addr);
}
break;
Прежде чем задать этот вопрос, я искал в SO ту же тему и получил смешанные ответы на эту тему. Например, см.этот, этот а такжеэтот пост, в котором говорится, что использовать такой код безопасно. Также есть еще одинсообщение это говорит об использовании профсоюзов для такой задачи, но опять же комментарии к принятому ответу стали различаться.
от Microsoftдокументация на той же структуре говорит -
Разработчики приложений обычно используют только элемент ss_family из SOCKADDR_STORAGE. Остальные члены гарантируют, что SOCKADDR_STORAGE может содержать адрес IPv6 или IPv4, а структура дополняется соответствующим образом для достижения 64-битного выравнивания. Такое выравнивание позволяет специфичным для протокола структурам данных адресов сокетов обращаться к полям в структуре SOCKADDR_STORAGE без проблем выравнивания. Со своим заполнением структура SOCKADDR_STORAGE имеет длину 128 байт.
OpenGroup-хдокументация состояния -
Заголовок должен определять структуру sockaddr_storage. Эта структура должна быть:
Достаточно большой, чтобы вместить все поддерживаемые структуры адресов протокола
Выравнивается по соответствующей границе, чтобы указатели на нее можно было приводить как указатели на адресные структуры протокола и использовать для доступа к полям этих структур без проблем выравнивания.
Страница человека изразъем также говорит то же самое -
Кроме того, API сокетов предоставляет тип данных struct sockaddr_storage. Этот тип подходит для размещения всех поддерживаемых доменных структур адреса сокетов; он достаточно большой и правильно выровнен. (В частности, он достаточно большой для хранения адресов сокетов IPv6.)
Я видел несколько реализаций, использующих такие приведения в обоихC
а такжеC++
языки в дикой природе, и теперь я не уверен в том, какой из них прав, поскольку есть некоторые посты, которые противоречат вышеуказанным утверждениямэтот а такжеэтот.
Так какой из них является безопасным и правильным способом заполнитьsockaddr_storage
состав? Эти указатели безопасны? илиметод объединения? Я также знаю оgetaddrinfo()
вызов, но это кажется немного сложным для вышеупомянутой задачи простого заполнения структур. Есть еще одинрекомендуемый способ с memcpyэто безопасно?