文章目录Socket编程必懂inet_ntop/inet_pton 字节序转换记不混版一、前言二、核心总纲先分清两类转换三、IP地址转换inet_ntop inet_pton1. 核心背景2. 函数拆解先记名字再记功能1inet_pton文本→网络p→n2inet_ntop网络→文本n→p3. 关键注意点四、字节序转换htons/htonl/ntohs/ntohl1. 核心背景2. 函数命名规则记准不混3. 四个函数详解4. 实战示例端口/IP转换5. 关键注意点五、核心总结记忆口诀关键要点1. IP地址转换2. 字节序转换3. 避坑关键Socket编程必懂inet_ntop/inet_pton 字节序转换记不混版一、前言Socket编程中IP地址格式转换和字节序转换是高频易错点——要么记混inet_ntop和inet_pton的方向要么搞反htons和ntohs的转换逻辑。本文用「核心定义函数拆解记忆口诀实战示例」帮你彻底分清IP地址二进制网络格式 ↔ 点分十进制文本字节序主机小端 ↔ 网络大端从此再也不记岔二、核心总纲先分清两类转换转换类型核心目标工具函数IP地址转换二进制网络地址 ↔ 点分十进制文本inet_ntop、inet_pton字节序转换主机字节序小端 ↔ 网络字节序大端htons、htonl、ntohs、ntohl记忆口诀IP转换p→n文本转网络n→p网络转文本字节序h→n主机转网络n→h网络转主机。三、IP地址转换inet_ntop inet_pton1. 核心背景计算机网络中IP地址在传输时是二进制数值如IPv4是32位整数但人类可读的是点分十进制文本如192.168.1.100。这两个函数就是用来完成“机器格式”和“人类格式”的互转。2. 函数拆解先记名字再记功能1inet_pton文本→网络p→n全称inet_pton internet presentation to networkpresentation表示人类可读的文本格式network网络二进制格式。作用将点分十进制的IP字符串转换成网络协议使用的二进制地址结构。函数原型intinet_pton(intaf,constchar*src,void*dst);af地址族IPv4用AF_INETIPv6用AF_INET6src输入点分十进制IP字符串如192.168.1.100dst输出指向网络地址结构的指针如struct in_addr *返回值成功返回1无效地址返回0失败返回-1。实战示例IPv4转换#includearpa/inet.h#includestdio.hintmain(){structin_addraddr;// IPv4地址结构// 将字符串IP转换为二进制网络格式intretinet_pton(AF_INET,192.168.1.100,addr);if(ret1){printf(转换成功二进制地址%u\n,addr.s_addr);}return0;}2inet_ntop网络→文本n→p全称inet_ntop internet network to presentation作用将二进制的网络地址结构转换成人类可读的点分十进制字符串。函数原型constchar*inet_ntop(intaf,constvoid*src,char*dst,socklen_tsize);af地址族AF_INET/AF_INET6src输入指向网络地址结构的指针如struct in_addr *dst输出存储转换后字符串的缓冲区size缓冲区大小IPv4建议用INET_ADDRSTRLENIPv6用INET6_ADDRSTRLEN返回值成功返回dst指针失败返回NULL。实战示例IPv4转换#includearpa/inet.h#includestdio.h#includestring.hintmain(){structin_addraddr;// 先手动设置二进制地址对应192.168.1.100addr.s_addr0x6401a8c0;charip_str[INET_ADDRSTRLEN];// 预定义的IPv4字符串长度// 二进制转字符串constchar*retinet_ntop(AF_INET,addr,ip_str,sizeof(ip_str));if(ret){printf(转换成功IP字符串%s\n,ip_str);// 输出192.168.1.100}return0;}3. 关键注意点支持IPv4和IPv6老函数inet_addr/inet_ntoa仅支持IPv4已被淘汰inet_pton的dst要传地址结构的指针不能直接传字符串inet_ntop必须指定缓冲区大小避免缓冲区溢出。四、字节序转换htons/htonl/ntohs/ntohl1. 核心背景网络字节序规定为大端序高位字节存低地址所有网络传输的数据必须用大端序主机字节序多数计算机是小端序低位字节存低地址少数是大端序转换函数的作用屏蔽主机字节序差异确保数据在网络中正确传输。2. 函数命名规则记准不混函数名由4个部分组成拆解如下前缀/后缀含义hhost主机字节序nnetwork网络字节序sshort短整型2字节对应端口号llong长整型4字节对应IPv4地址3. 四个函数详解函数作用适用场景htons()host to network short主机序短整型→ 网络序端口号转换如8080端口转网络序htonl()host to network long主机序长整型→ 网络序IPv4地址转换如192.168.1.100转网络序ntohs()network to host short网络序短整型→ 主机序接收的端口号转回主机序ntohl()network to host long网络序长整型→ 主机序接收的IPv4地址转回主机序4. 实战示例端口/IP转换#includearpa/inet.h#includestdio.hintmain(){// 1. 端口号转换short型unsignedshorthost_port8080;unsignedshortnet_porthtons(host_port);printf(主机序端口%d → 网络序端口%u\n,host_port,net_port);// 转回主机序unsignedshortback_portntohs(net_port);printf(网络序转回主机序%u\n,back_port);// 输出8080// 2. IP地址转换long型unsignedinthost_ip0xc0a80164;// 主机序的192.168.1.100小端unsignedintnet_iphtonl(host_ip);printf(主机序IP%u → 网络序IP%u\n,host_ip,net_ip);// 转回主机序unsignedintback_ipntohl(net_ip);printf(网络序转回主机序%u\n,back_ip);// 输出原主机序IPreturn0;}5. 关键注意点若主机本身是大端序这些函数会直接返回原值无转换不影响逻辑端口号必须用htons()/ntohs()shortIP地址必须用htonl()/ntohl()long跨平台开发时所有网络传输的数值端口、IP、自定义数据都必须做字节序转换。五、核心总结记忆口诀关键要点1. IP地址转换核心p文本↔n网络二进制inet_pton文本转网络入参字符串出参地址结构inet_ntop网络转文本入参地址结构出参字符串缓冲区。2. 字节序转换核心h主机↔n网络s端口、lIP发送数据htons()端口/htonl()IP→ 转网络序接收数据ntohs()端口/ntohl()IP→ 转主机序。3. 避坑关键永远不要手动拼接二进制IP/端口必须用标准函数字节序转换只针对数值IP字符串无需转换先转二进制再转字节序。
【Socket中 IP地址转换(inet_ntop、inet_pton)、字节序(htons(), htonl(), ntohs(), 和 ntohl() )】
文章目录Socket编程必懂inet_ntop/inet_pton 字节序转换记不混版一、前言二、核心总纲先分清两类转换三、IP地址转换inet_ntop inet_pton1. 核心背景2. 函数拆解先记名字再记功能1inet_pton文本→网络p→n2inet_ntop网络→文本n→p3. 关键注意点四、字节序转换htons/htonl/ntohs/ntohl1. 核心背景2. 函数命名规则记准不混3. 四个函数详解4. 实战示例端口/IP转换5. 关键注意点五、核心总结记忆口诀关键要点1. IP地址转换2. 字节序转换3. 避坑关键Socket编程必懂inet_ntop/inet_pton 字节序转换记不混版一、前言Socket编程中IP地址格式转换和字节序转换是高频易错点——要么记混inet_ntop和inet_pton的方向要么搞反htons和ntohs的转换逻辑。本文用「核心定义函数拆解记忆口诀实战示例」帮你彻底分清IP地址二进制网络格式 ↔ 点分十进制文本字节序主机小端 ↔ 网络大端从此再也不记岔二、核心总纲先分清两类转换转换类型核心目标工具函数IP地址转换二进制网络地址 ↔ 点分十进制文本inet_ntop、inet_pton字节序转换主机字节序小端 ↔ 网络字节序大端htons、htonl、ntohs、ntohl记忆口诀IP转换p→n文本转网络n→p网络转文本字节序h→n主机转网络n→h网络转主机。三、IP地址转换inet_ntop inet_pton1. 核心背景计算机网络中IP地址在传输时是二进制数值如IPv4是32位整数但人类可读的是点分十进制文本如192.168.1.100。这两个函数就是用来完成“机器格式”和“人类格式”的互转。2. 函数拆解先记名字再记功能1inet_pton文本→网络p→n全称inet_pton internet presentation to networkpresentation表示人类可读的文本格式network网络二进制格式。作用将点分十进制的IP字符串转换成网络协议使用的二进制地址结构。函数原型intinet_pton(intaf,constchar*src,void*dst);af地址族IPv4用AF_INETIPv6用AF_INET6src输入点分十进制IP字符串如192.168.1.100dst输出指向网络地址结构的指针如struct in_addr *返回值成功返回1无效地址返回0失败返回-1。实战示例IPv4转换#includearpa/inet.h#includestdio.hintmain(){structin_addraddr;// IPv4地址结构// 将字符串IP转换为二进制网络格式intretinet_pton(AF_INET,192.168.1.100,addr);if(ret1){printf(转换成功二进制地址%u\n,addr.s_addr);}return0;}2inet_ntop网络→文本n→p全称inet_ntop internet network to presentation作用将二进制的网络地址结构转换成人类可读的点分十进制字符串。函数原型constchar*inet_ntop(intaf,constvoid*src,char*dst,socklen_tsize);af地址族AF_INET/AF_INET6src输入指向网络地址结构的指针如struct in_addr *dst输出存储转换后字符串的缓冲区size缓冲区大小IPv4建议用INET_ADDRSTRLENIPv6用INET6_ADDRSTRLEN返回值成功返回dst指针失败返回NULL。实战示例IPv4转换#includearpa/inet.h#includestdio.h#includestring.hintmain(){structin_addraddr;// 先手动设置二进制地址对应192.168.1.100addr.s_addr0x6401a8c0;charip_str[INET_ADDRSTRLEN];// 预定义的IPv4字符串长度// 二进制转字符串constchar*retinet_ntop(AF_INET,addr,ip_str,sizeof(ip_str));if(ret){printf(转换成功IP字符串%s\n,ip_str);// 输出192.168.1.100}return0;}3. 关键注意点支持IPv4和IPv6老函数inet_addr/inet_ntoa仅支持IPv4已被淘汰inet_pton的dst要传地址结构的指针不能直接传字符串inet_ntop必须指定缓冲区大小避免缓冲区溢出。四、字节序转换htons/htonl/ntohs/ntohl1. 核心背景网络字节序规定为大端序高位字节存低地址所有网络传输的数据必须用大端序主机字节序多数计算机是小端序低位字节存低地址少数是大端序转换函数的作用屏蔽主机字节序差异确保数据在网络中正确传输。2. 函数命名规则记准不混函数名由4个部分组成拆解如下前缀/后缀含义hhost主机字节序nnetwork网络字节序sshort短整型2字节对应端口号llong长整型4字节对应IPv4地址3. 四个函数详解函数作用适用场景htons()host to network short主机序短整型→ 网络序端口号转换如8080端口转网络序htonl()host to network long主机序长整型→ 网络序IPv4地址转换如192.168.1.100转网络序ntohs()network to host short网络序短整型→ 主机序接收的端口号转回主机序ntohl()network to host long网络序长整型→ 主机序接收的IPv4地址转回主机序4. 实战示例端口/IP转换#includearpa/inet.h#includestdio.hintmain(){// 1. 端口号转换short型unsignedshorthost_port8080;unsignedshortnet_porthtons(host_port);printf(主机序端口%d → 网络序端口%u\n,host_port,net_port);// 转回主机序unsignedshortback_portntohs(net_port);printf(网络序转回主机序%u\n,back_port);// 输出8080// 2. IP地址转换long型unsignedinthost_ip0xc0a80164;// 主机序的192.168.1.100小端unsignedintnet_iphtonl(host_ip);printf(主机序IP%u → 网络序IP%u\n,host_ip,net_ip);// 转回主机序unsignedintback_ipntohl(net_ip);printf(网络序转回主机序%u\n,back_ip);// 输出原主机序IPreturn0;}5. 关键注意点若主机本身是大端序这些函数会直接返回原值无转换不影响逻辑端口号必须用htons()/ntohs()shortIP地址必须用htonl()/ntohl()long跨平台开发时所有网络传输的数值端口、IP、自定义数据都必须做字节序转换。五、核心总结记忆口诀关键要点1. IP地址转换核心p文本↔n网络二进制inet_pton文本转网络入参字符串出参地址结构inet_ntop网络转文本入参地址结构出参字符串缓冲区。2. 字节序转换核心h主机↔n网络s端口、lIP发送数据htons()端口/htonl()IP→ 转网络序接收数据ntohs()端口/ntohl()IP→ 转主机序。3. 避坑关键永远不要手动拼接二进制IP/端口必须用标准函数字节序转换只针对数值IP字符串无需转换先转二进制再转字节序。