Subscribed unsubscribe Subscribe Subscribe

inet_addrはネットワークバイトオーダーではない

Haskell

manpageには

The inet_addr() function converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order.

と書いてあるのに、下記プログラムの出力はリトルエンディアンになっているのは何故だろう。

#include <stdio.h>
#include <arpa/inet.h>

int main(void)
{
    char *addr = "1.0.0.0";
    printf("%s = %u\n", addr, inet_addr(addr));
    printf("%s = %u\n", addr, htonl(inet_addr(addr)));
    return 0;
}
$ ./a.out 
1.0.0.0 = 1
1.0.0.0 = 16777216

inet_addrをそのまま使っているNetwork.Socketのinet_addrも当然のことながら同じ動きをする。

Prelude Network.Socket> inet_addr "1.0.0.0"
1

ソースにもnetwork byte orderとのコメント。どういう事だろう。

inet_addr :: String -> IO HostAddress
inet_addr ipstr = do
   withCString ipstr $ \str -> do
   had <- c_inet_addr str
   if had == -1
    then ioError (userError ("inet_addr: Malformed address: " ++ ipstr))
    else return had  -- network byte order