доказательства того, что они полезны - только не для вас.

моего предыдущеговопросМне действительно интересно этот код -

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это безопасно?

Ответы на вопрос(2)

Ваш ответ на вопрос