为什么使用网络字节顺序时 sendto 会反转我的 IP 地址?

问题描述 投票:0回答:1

我正在尝试将多播 UDP 数据包发送到 IP 地址

239.255.0.1
。我有一个
ConnectionAttributes
类,用于存储 IP 地址,并可以按网络字节顺序 (NBO) 或主机字节顺序 (HBO) 返回它们。

以下是两种格式的 IP 239.255.0.1 的值:

IP: 239.255.0.1
NBO: 4026466305 (0xEFFC0001)
HBO: 16842735 (0x0100FFEF)

这是我用来通过套接字发送数据的 C++ 代码片段:

Error UDPConnectionHandler::send(const void *data, size_t dataSize) {

    auto nbo = 4026466305; // 239.255.0.1 in network byte order
    auto hbo = 16842735; // 239.255.0.1 in host byte order

    sockaddr_in destAddr = {};
    destAddr.sin_family = AF_INET;
    destAddr.sin_port = 59420;
    destAddr.sin_addr.s_addr = nbo;
    ssize_t bytesSent;

    bytesSent = sendto(connAttr.getSocket(), data, dataSize, 0, (struct sockaddr *)&destAddr, sizeof(destAddr));

    if (bytesSent == -1)
          return Error(ERROR_ERRNO, errno);

    return Error(ERR_SUCCESS);
}

但是,如果我以 主机字节顺序 (16842735) 提供 IP,则数据包将使用 IP 地址正确发送

239.255.0.1

我的理解是

sendto
应该采用网络字节顺序。当我以网络字节顺序提供 IP 地址时,为什么它会反转 IP 地址?我在这里缺少什么?

c++ sockets
1个回答
0
投票

您将外部表示与内部表示混淆了。您的 CPU 是小端字节序,因此您的“NBO”0xEFFC0001 实际上存储为以下字节序列:

01 00 FC EF

htonl(0xEFFC0001)
是计算网络字节顺序的正确方法。它将在小端系统上进行字节交换,而在大端系统上不执行任何操作。 (但无论如何,这种情况很少见)

© www.soinside.com 2019 - 2024. All rights reserved.