【问题标题】:Why my IP address received is reversed? Given - 12.0.0.100, received as 100.0.0.12 in C为什么我收到的 IP 地址被颠倒了?给定 - 12.0.0.100,在 C 中接收为 100.0.0.12
【发布时间】:2018-09-30 21:04:31
【问题描述】:

我正在测试 RADIUS-DISCONNECT 选项。

服务器发送断开请求断开连接(Cmd:cat packet.txt | radclient -c 10 -i 40 -x 12.0.0.1:3799 disconnect "Secret"

我的 RAIDUS 服务器配置为 12.0.0.100。 RADIUS 客户端 IP 配置为 12.0.0.1。

从服务器发送的数据包使用数据包捕获命令捕获相同。数据包捕获说源 IP 为:Source: 12.0.0.100 (12.0.0.100)。

但在接收时,打印我的服务器 IP 时,它是 100.0.0.12,因此,我无法跟踪或验证服务器详细信息。我不知道这是否是由于小端、大端问题。

GDB 在服务器 IP 上打印:{0xc, 0x0, 0x0, 0x64, 0x0 <repeats 12 times>} 但实际上必须是 {0x64, 0x0, 0x0, 0xc, 0x0 <repeats 12 times>}

如果是由于小端或大端问题,谁能告诉我如何解决这个问题。

请有人帮忙。

【问题讨论】:

  • 网络字节序为大端,x86 为小端。您需要根据要交换的字节数使用宏 ntohl() 和 htonl() 或 ntohs() 和 htons()。

标签: c ip ip-address endianness radius


【解决方案1】:

绝大多数协议中 IP 地址的有线格式是大端格式,而您似乎希望 IP 地址采用小端格式。

提供了宏 htonl(主机到网络长)和 ntohl(网络到主机长)将字节序从大字节序转换为主机使用的任何字节序(大、小或混合)。

uint8_t  *packet;
uint32_t ip_net;
uint32_t ip_host;

memcpy(&ip_net, packet, sizeof(ip_net));  /* Assuming packet is a buffer of at least 4 bytes */
ip_host = ntohl(ip_net);

您可能会在其他代码中看到指向数据包缓冲区的指针的实例被强制转换为 uint32_t,并将其传递给字节顺序转换函数。这可能适用于某些架构 (x86),但可能会导致其他架构 (Sparc) 上的内存访问不对齐。

通常最好的做法是将正在处理的缓冲区中的数据 memcpy 到中间变量,因为 memcpy 将处理对齐问题,并保证堆栈变量得到适当的对齐。

有这些问题和可用方法的快速总结here

【讨论】:

  • Solaris 至少从 Solaris 10 开始就符合 in_addr_t 的 POSIX 定义为 uint32_t,并且在实践中已经将其作为 32 位字的时间更长,如果您需要从一个缓冲区,由malloc() 返回的缓冲区将起作用(因为它与具有最严格要求的类型对齐)或者您可以使用alignas 声明您的缓冲区。
  • 如果 IP 地址在缓冲区的开头,是的。如果使用 libpcap 或原始套接字读取数据包,那么您可能会在缓冲区中有以太网标头,这意味着即使缓冲区的开头是 IP 地址字段也可能不会对齐。
  • 如果你给复制操作缓冲区的地址,它会复制到缓冲区的开头。实际上,如果您知道要存储 IPv4 地址,则可以将缓冲区设置为 in_addr_t,或者如果您正在接收某种任意类型的连接,例如侦听多个网络上的连接协议,您将为sockaddr_storage 分配空间并使用套接字库来填充它。
  • AFAIK 无法让 libpcap 或原始套接字 API 从传入数据包中的特定偏移量开始复制到缓冲区,因此 libpcap > 应用程序缓冲区至少需要为 sizeof(l2 header) + sizeof(in_addr_t) || sizeof(sockaddr_storage) .
  • 原始协议头和套接字地址会有不同的缓冲区,而来自网络的数据的缓冲区可能是对应于数据包或头的结构。如果您需要在缓冲区中表示多种类型,则应为union。此时,您无论如何都需要复制并重新格式化数据。该标准不保证结构的字段之间不会有填充,因此如果您想要完全可移植的代码,您确实需要memcpy()。不过,对于实际存在的 CPU,自然对齐就足够了。
猜你喜欢
  • 2013-07-27
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多