2011-02-08 111 views
1

当谈到这个问题时,我很关心字节序列。也许我正在过度考虑我必须担心的事情。将字节数组转换为in_addr或in6_addr和endianness

输入到我的代码看起来像一个包:

我收到一个包含一些字节的网络数据包。如果我知道的字节数组中的索引(以及具有有效数据),其中in_addr是,它是安全做这样的事情:

uint8_t* addrPtr = packet[IP_IDX]; 
struct in_addr addr; 
memcpy((void*) addr, addrPtr, sizeof(in_addr)); 

这是安全的,无论字节顺序呢?

对于in6_addr,实际上是16个字节呢?

谢谢。

回答

4

struct in_addr应该是网络字节顺序,IIRC。假设你的数据包也是以网络字节顺序传递的,那么你很好。

+0

当我想将它发回时怎么办?假设已经通过send()发送出去的缓冲区已经处于网络字节顺序? – Anon 2011-02-08 20:44:43

+0

@Anon,这取决于你的协议。在正常情况下,是的,在调用`send()`之前,您发送的缓冲区是按网络字节顺序排列的。 – 2011-02-08 23:11:24

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的并不做任何字节序,它只是复制字节,所以只要你不拉抵消了该数据包的你不需要担心memcpy ...除非我不明白你的问题是什么。

如果你想处理IPv6,你可能需要单独的代码,因为偏移量和地址大小是不同的。

基本上除了在两个地方伪造'地址'运算符,你的代码看起来很好。