从ip header __be32 saddr和udp header __be16 source填写struct sockaddr_in

时间:2016-07-07 12:48:31

标签: linux-kernel network-programming endianness

我在UDP上的 linux内核中实现协议,并希望在收到数据包时从内核中发送回复。为此,我想运行ip4_datagram_connect以获取到目的地的路由(这是收到的数据包中的源地址),然后发送回复。

要调用ip4_datagram_connect,我需要填写一个sockaddr_in结构作为地址传递给函数。比较,

struct sockaddr_in

unsigned short   sin_port;           
struct in_addr   sin_addr;

struct udphdr

__be16 source;

struct iphdr

__be32 saddr;

所以我的问题是,我是否需要任何辅助函数来将数据包头中的地址和端口复制到sockaddr_in结构中(就像我们在套接字编程中使用htons等一样)?

1 个答案:

答案 0 :(得分:1)

原始IP和UDP标头中的值已按网络字节顺序排列。例如be __be16代表“Big Endian”,它是网络字节顺序。 __be16__be32中的数字是位数。

sockadd_in结构中的字段也应该按网络字节顺序排列。名称htons代表“Host To Network Short”,即它将short(通常为16位)从主机字节顺序转换为网络字节顺序。

所以回答你的问题:不,你不需要做任何事情,sin_portsin_addr.s_addr的简单分配就足够了。