gpt4 book ai didi

c - 将 char 类型转换为 int(用于套接字)

转载 作者:行者123 更新时间:2023-11-30 19:24:12 26 4
gpt4 key购买 nike

从今天起我可能已经问过这个问题两次了,但我仍然没有得到满意的答案。我的问题是我的 IP 地址存储在 unsigned char 中。现在我想通过套接字将这个IP地址从客户端发送到服务器。人们建议我使用 htonl()ntohl()用于网络字节传输,但我无法理解 htonl() 的参数和ntohl()是整数...在 unsigned char 的情况下我该如何使用它??如果我不能使用它,我如何确保如果我发送130.191.166.230在我的缓冲区中,接收者将始终收到相同的信息?任何意见或指导将不胜感激。提前致谢。

最佳答案

如果您有一个形成 IP 地址的无符号字符数组字符串(沿着“10.0.0.7”行)(我假设您这样做,因为那里周围很少有 32 位 char 系统,这使得将 IP 地址存储到单个字符中相当困难),您可以按原样发送它并让另一端使用它(假设当然,你们都以相同的方式对字符进行编码,例如使用 ASCII)。

<小时/>

另一方面,您可能有一个包含二进制 IP 地址的四字节字符数组(假设字符为八位)。

使用htonlntohl是为了确保这个二进制数据按照大端和小端的顺序发送-endian系统可以理解。

为此,网络字节顺序(“线路上”的字节顺序)是大端字节序,因此这些函数在大端字节序系统上基本上不执行任何操作。在小端系统上,它们交换字节。

换句话说,您可能拥有以下二进制数据:

uint32_t ipaddress = 0x0a010203; // for 10.1.2.3

在大端布局中将存储为0x0a,0x01,0x02,0x03,在小端布局中将存储为0x03,0x02,0x01,0x0a

因此,如果您想以网络字节顺序发送它(任何字节序系统都能够理解),您不能这样做:

write (fd, &ipaddress, 4);

由于将其从小端系统发送到大端系统,因此最终会出现字节反转的情况。

您需要做的是:

uint32_t ipaddress = 0x0a010203; // for 10.1.2.3
uint32_t ip_netorder = htonl (ipaddress); // change if necessary.
write (fd, &ip_netorder, 4);

这迫使它成为另一端的任何程序都可以理解的网络字节顺序(假设它使用ntohl来确保其正确性)。

事实上,这个方案不仅仅可以处理大端和小端。如果您有一个 32 位整数编码方案,其中 ABCD(四个字节)被编码为 A,D,B,C,或者甚至您有一个奇怪的狂野位混合形成整数(例如先使用偶数位,然后使用奇数位),这仍然有效,因为您的本地 htonlntohl 了解这些格式并可以将它们正确转换为网络字节订单。

关于c - 将 char 类型转换为 int(用于套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6869522/

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