Манипулирование необработанными IP-адресами в сети и путаница с порядком байтов

Документация для HostAddress и HostAddress6 из сетевой пакет говорит:

-- | Network byte order.
type HostAddress = Word32

-- | Host byte order.
type HostAddress6 = (Word32, Word32, Word32, Word32)

Что на самом деле означает этот порядок байтов? В конце концов, Word32 должен быть числом, независимым от порядка байтов хоста, порядок следования байтов должен иметь значение только тогда, когда (de) сериализуя его.

Моей цели присваивается адрес IPv4 или IPv6 для построения правильного значения SockAddr.

Кажется, что для HostAddress порядок байтов меняется на архитектурах с прямым порядком байтов, так как я show $ SockAddrInet 0 0x0100007f дает "127.0.0.1:0". А show $ SockAddrInet6 0 0 (0,0,0,1) 0 дает "[::1]:0, так что вроде порядок байтов правильный. Но в настоящее время у меня нет возможности протестировать его на архитектуре с прямым порядком байтов.


person Petr    schedule 24.06.2016    source источник
comment
Я предполагаю, что они в сериализованном формате, как после функций C htons, htoni,..., которые искажают биты для преобразования из хост-порядка байтов в сетевой порядок байтов. Они должны были быть newtypes, ИМО. (Кроме того, мне очень не нравятся библиотеки, которые объявляют себя полуобщественными. Внутренние модули должны быть непрозрачными.)   -  person chi    schedule 24.06.2016
comment
@Petr Pudlák - Можете ли вы хотя бы дать отзыв о моем ответе? Спасибо.   -  person ErikR    schedule 25.06.2016


Ответы (1)


Модуль Data.IP выглядит так, как будто он решает эту проблему.

Посмотри на:

и различные способы создания значений IPv4 и IPv6.

person ErikR    schedule 24.06.2016
comment
Спасибо вам за ссылки. Я осмотрел упаковку, и она действительно выглядит хорошо. Меня больше всего беспокоит то, что это часть более крупного пакета, от которого моей библиотеке пришлось бы зависеть без необходимости. Также я несколько недоволен функциями для (де)конструирования IPv4 и IPv6, которые используют списки вместо кортежей (менее типобезопасные), но я думаю, это легко исправить с помощью запроса на включение :). - person Petr; 25.06.2016