gpt4 book ai didi

python - sin_family 的网络字节顺序

转载 作者:行者123 更新时间:2023-11-30 14:53:47 26 4
gpt4 key购买 nike

我正在从 Ubuntu 机器上的 python 向 vxworks 机器上的 C 程序发送一条 UDP 消息。 vxworks 机器上的 Endianness 与网络字节顺序不匹配,因此我被迫使用 ntohs、ntohl 等交换字节顺序。

我正在从 UDP 连接中读取数据,然后尝试确定“系列”,以便我知道是否应该解码 IPV4 或 IPV6。我想做这样的事情......但它不起作用。

struct sockaddr data = {};
char udp_ip[INET6_ADDRSTRLEN] = {0};
// ... (recvfrom ...)
if (AF_INET == data.sa_family)
{
struct sockaddr_in*s = (struct sockaddr_in *)&data;
const char *addr = inet_ntop(AF_INET, &s->sin_addr, udp_ip, sizeof(udp_ip));
udp_port = ntohs(s->sin_port);
...
}
if (AF_INET6 == data.sa_family)
{
struct sockaddr_in6 *s = (struct sockaddr_in *)&data;
const char *addr = inet_ntop(AF_INET6, &s->sin6_addr, udp_ip, sizeof(udp_ip));
udp_port = ntohs(s->sin6_port);
...
}

我习惯于看到端口和类似的字段交换,但我发现该系列是一个多字节字段。我发现代码不起作用,因为我的 sa_family 值超出范围。在我的这台机器的 header 中,最大的 AF_* 值是 40。我看到的值超过 500。我看起来 sa_family 上的字节已交换,我也需要交换它们的字节顺序。像这样的东西:

const sa_family_t family = ntohs(data.sa_family);

然后我会在 if 检查中使用该系列变量。 问题:这合理吗?我以前从未见过有人对这个家庭做过这样的事。我很惊讶它是多字节(sizeof(data.sa_family)== 2)。

我认为我的 python 代码不相关,但为了完整性..

udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_sock.bind(('', 0))
data = self.create_data()
udp_sock.sendto(data, (ip, port))

发送的数据有点无关紧要,因为我什至在解析数据之前就陷入了困境,如果数据像“FOO”一样简单,问题就会出现。

我检查过的其他文章:what kind of fields in network packets should be converted to network byte order以及Network byte order and endianness issues .

我也读过这篇文章,这似乎与我所看到的相矛盾。 struct sockaddr_in member byte order for bind()

同样,相反,(但未显示),当从我的 vxworks(非网络字节顺序机器)将消息发送回我的另一台机器时,我必须在设置消息时使用 htons(AF_INET) ,否则它不会不工作。我只是很困惑,因为我在这里看到了相互矛盾的建议,所以我认为我一定是在做其他根本错误的事情。 问题:如果建议您不需要改变家庭(htons/ntohs),我做错了什么?

最佳答案

家庭不需要转变。它本身并不被传输。请参阅:

https://en.wikipedia.org/wiki/IPv4

https://en.wikipedia.org/wiki/IPv6

如果版本值为4,则其IP版本==4...IPV4。如果其版本==6..则为IPV6。

真正的问题是我正在交叉编译并且目 header 文件的版本错误。我有一个结构是这样的:

struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};

当在真实系统上,结构包含另一个字段时:

/*
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr {
unsigned char sa_len; /* total length */
sa_family_t sa_family; /* address family */
char sa_data[14]; /* actually longer; address value */
};
#define SOCK_MAXADDRLEN 255 /* longest possible addresses */

额外的字符和字节序是我问题的根源。我看到一个像 528 这样的值。当字节被组合并被视为两个字节无符号时,它是长度“10”和系列“2”的组合。

关于python - sin_family 的网络字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com