我在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等一样)?
答案 0 :(得分:1)
原始IP和UDP标头中的值已按网络字节顺序排列。例如be
__be16
代表“Big Endian”,它是网络字节顺序。 __be16
和__be32
中的数字是位数。
sockadd_in
结构中的字段也应该按网络字节顺序排列。名称htons
代表“Host To Network Short”,即它将short
(通常为16位)从主机字节顺序转换为网络字节顺序。
所以回答你的问题:不,你不需要做任何事情,sin_port
和sin_addr.s_addr
的简单分配就足够了。