我正在测试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>}
如果是由于小端或大端问题,有人可以告诉我如何解决问题。
请有人帮忙。
答案 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