h_addr_list - это символ ** в структуре размещения.
Итак:
sin.sin_addr.s_addr = (uint32_t)(*(hs->h_addr_list[0]));
hs-> h_addr_list [0] содержит дает указатель на символ.
Вы разыменовываете его, получая символ, затем бросаете его в uint32_t.Это означает, что вы берете первый байт, на который указывает hs-> h_addr_list [0], и конвертируете его в 4-байтовое целое число, тем самым теряя последующие 3 байта.
You do getчисло в вашем uint32_t, но оно представляет собой однобайтовое целое число.
sin.sin_addr.s_addr = *(uint32_t *)(hs->h_addr_list[0]);
Здесь вы берете указатель char, приводите его к указателю uint32_t и затем разыменовываете его.
Таким образом, вы читаете все 4 байта, начиная с hs-> h_addr_list [0], которые могут быть напрямую преобразованы в ваш uint32_t.Если вы знаете, что ваша структура hs правильно инициализирована, это будет работать.
В качестве предостережения: Полученное значение uint32_t будет иметь сетевой порядковый номер, который может отличаться от порядкового номера вашего компьютера.
Пока функции, которым вы передаете это значение, ожидают этого, хорошо.Вы должны просто осознавать это в глубине души.