当涉及到这个问题时,我很关心字节序。也许我在思考我不得不担心的事情。
我的代码输入是一个类似于:
的数据包我收到了一个包含一些字节的网络数据包。如果我知道in_addr
所在的字节数组中的索引(并且有有效数据),那么执行以下操作是否安全:
uint8_t* addrPtr = packet[IP_IDX];
struct in_addr addr;
memcpy((void*) addr, addrPtr, sizeof(in_addr));
无论Endianness如何,这都是安全的吗?
in6_addr实际上是16个字节呢?
感谢。
答案 0 :(得分:4)
struct in_addr
应该是网络字节顺序,IIRC。假设您的数据包也以网络字节顺序传送,那么您可以继续使用。
答案 1 :(得分:1)
如果你这样做:
uint8_t* addrPtr = packet + IP_IDX; // or &packet[IP_IDX]; whichever makes you happy
struct in_addr addr;
memcpy((void*) &addr, addrPtr, sizeof(in_addr));
你应该很好,memcpy对endianess没有任何作用,它只是复制字节,所以只要你不从数据包中拉出偏移量就不需要担心memcpy ...除非我不明白你的问题是什么。
如果你想处理IPv6,你可能需要单独的代码,因为偏移量和地址大小不同。
除了在两个地方伪造'地址'运算符之外,您的代码看起来还不错。