为什么收到的IP地址被撤消了?给定 - 12.0.0.100,在C

时间:2018-04-20 07:50:54

标签: c ip ip-address endianness radius

我正在测试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称为:源: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>}

如果是由于小端或大端问题,有人可以告诉我如何解决问题。

请有人帮忙。

1 个答案:

答案 0 :(得分: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会处理对齐问题,并且保证堆栈变量能够正确对齐。

这些问题和可用方法的快速摘要here