【问题标题】:Filling up struct sockaddr_in from the ip header __be32 saddr and udp header __be16 source从 ip 标头 __be32 saddr 和 udp 标头 __be16 源填充 struct sockaddr_in
【发布时间】:2016-07-07 12:48:31
【问题描述】:

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

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

struct sockaddr_in

unsigned short   sin_port;           
struct in_addr   sin_addr;

结构 udphdr

__be16 source;

结构 iphdr

__be32 saddr;

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

【问题讨论】:

    标签: linux-kernel network-programming endianness


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我试试,然后在这里报告:)
    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多