# #include <algorithm> // 包含std::copy
# auto it = std::find_if(recvDataList.begin(), recvDataList.end(), [](unsigned char d) {return d <= 0x7f; });
# 在 C/C++ 编程中,htonl 和 htons 是用于字节序转换的函数,它们声明在 arpa/inet.h 头文件中。
使用的头文件
#include <arpa/inet.h>
函数说明
htonl(Host to Network Long)
功能:将主机字节序的 32 位整数(long 类型)转换为网络字节序(大端)。
使用场景:需要将主机字节序的 4 字节整数发送到网络时使用。
htons(Host to Network Short)
功能:将主机字节序的 16 位整数(short 类型)转换为网络字节序(大端)。
使用场景:需要将主机字节序的 2 字节整数发送到网络时使用。
对应的反向转换
ntohl:将网络字节序的 32 位整数转换为主机字节序。
ntohs:将网络字节序的 16 位整数转换为主机字节序。
示例代码
#include <arpa/inet.h>
#include <stdio.h>
int main() {
unsigned long hostLong = 0x12345678;
unsigned short hostShort = 0x1234;
unsigned long netLong = htonl(hostLong);
unsigned short netShort = htons(hostShort);
printf("Host long: 0x%lx, Network long: 0x%lx\n", hostLong, netLong);
printf("Host short: 0x%x, Network short: 0x%x\n", hostShort, netShort)
return 0;
}
编译和运行
gcc -o byteorder byteorder.c
./byteorder
输出(示例,大端模式网络字节序)
Host long: 0x12345678, Network long: 0x78563412
Host short: 0x1234, Network short: 0x3412
您说:
#include <arpa/inet.h> 头文件里有什么
ChatGPT 说:
ChatGPT
头文件 <arpa/inet.h> 是 UNIX 系统中网络编程的一个重要头文件,主要提供了 IP 地址转换和字节序转换的函数。以下是这个头文件中常见的内容及功能:
1. IP 地址转换函数
inet_addr
功能:将点分十进制的 IPv4 地址转换为网络字节序的 32 位地址。
函数声明:
in_addr_t inet_addr(const char *cp);
参数:
cp:指向点分十进制格式的 IPv4 地址字符串。
返回值:
成功:返回对应的网络字节序的 IPv4 地址。
失败:返回 INADDR_NONE(例如无效的 IP 地址)。
inet_aton
功能:功能类似 inet_addr,但更可靠。用于将点分十进制字符串转换为网络字节序的 IPv4 地址,并存储到 in_addr 结构中。
函数声明:
int inet_aton(const char *cp, struct in_addr *inp);
参数:
cp:点分十进制格式的 IPv4 地址。
inp:指向存储转换后结果的 struct in_addr。
inet_ntoa
功能:将网络字节序的 IPv4 地址转换为点分十进制字符串。
函数声明:
char *inet_ntoa(struct in_addr in);
返回值:
成功:返回指向静态缓冲区的点分十进制字符串。
inet_pton
功能:将字符串形式的 IP 地址(支持 IPv4 和 IPv6)转换为网络字节序的地址。
函数声明:
int inet_pton(int af, const char *src, void *dst);
参数:
af:地址族(AF_INET 或 AF_INET6)。
src:IP 地址字符串。
dst:存储转换后结果的缓冲区。
inet_ntop
功能:将网络字节序的 IP 地址(支持 IPv4 和 IPv6)转换为字符串形式。
函数声明:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
2. 字节序转换函数
htonl
功能:将主机字节序的 32 位整数转换为网络字节序。
声明:
uint32_t htonl(uint32_t hostlong);
htons
功能:将主机字节序的 16 位整数转换为网络字节序。
声明:
uint16_t htons(uint16_t hostshort);
ntohl
功能:将网络字节序的 32 位整数转换为主机字节序。
声明:
uint32_t ntohl(uint32_t netlong);
ntohs
功能:将网络字节序的 16 位整数转换为主机字节序。
声明:
uint16_t ntohs(uint16_t netshort);
3. 常量定义
INADDR_ANY
含义:表示接受任意地址的特殊地址。
常用于绑定服务器套接字,表示可以接收任意 IP 地址的数据包。
定义:
#define INADDR_ANY ((in_addr_t) 0x00000000)
INADDR_LOOPBACK
含义:表示回环地址,通常是 127.0.0.1。
定义:
#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001)
INADDR_BROADCAST
含义:表示广播地址。
定义:
#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
INADDR_NONE
含义:表示无效地址,通常用作错误返回值。
定义:
#define INADDR_NONE ((in_addr_t) 0xffffffff)