Linux下常用的网络编程函数详解

ops/2024/12/19 7:42:02/

网络编程中,我们经常需要处理 IP 地址和端口号等数据,这些数据需要在主机字节序(Host Byte Order)与网络字节序(Network Byte Order)之间进行转换。


什么是字节序?

字节序指的是多字节数据在内存中的存储顺序。

  • 主机字节序:不同的主机可能使用不同的字节序,如:

    • 小端序(Little Endian):低字节在前,高字节在后(如 x86 架构)。

    • 大端序(Big Endian):高字节在前,低字节在后。

  • 网络字节序:为了在不同主机之间通信,网络协议规定统一使用大端序(Big Endian)。

为了确保数据在网络传输中的一致性,我们需要进行字节序转换。


inet_ntoa

作用

inet_ntoa 将一个网络字节序的 IPv4 地址(二进制形式)转换为点分十进制字符串,方便人类阅读。

函数原型
#include <arpa/inet.h> // Linux/Unix
#include <winsock2.h> // Windows
char *inet_ntoa(struct in_addr in);
参数
  • in:一个 struct in_addr 类型的值,表示一个网络字节序的 IPv4 地址

返回值
  • 返回一个指向静态分配内存的字符串,表示点分十进制的 IPv4 地址。

示例
#include <stdio.h>
#include <arpa/inet.h>int main() {struct in_addr addr;addr.s_addr = htonl(0x7F000001); // 127.0.0.1 的网络字节序char *ip_str = inet_ntoa(addr);printf("IP 地址: %s\n", ip_str); // 输出:IP 地址: 127.0.0.1return 0;
}

注意事项

  • inet_ntoa 返回的字符串是静态分配的,因此多次调用会覆盖之前的结果。

  • 仅支持 IPv4,不支持 IPv6。


htonl

作用

htonl(Host TO Network Long)将一个主机字节序的 32 位整数转换为网络字节序

函数原型
#include <arpa/inet.h> // Linux/Unix
#include <winsock2.h> // Windows
uint32_t htonl(uint32_t hostlong);
参数
  • hostlong:一个 32 位整数(如 IPv4 地址或其他网络数据)。

返回值
  • 返回 hostlong 转换为网络字节序后的值。

示例
#include <stdio.h>
#include <arpa/inet.h>int main() {uint32_t host_long = 0x7F000001; // 127.0.0.1 的主机字节序uint32_t net_long = htonl(host_long);printf("主机字节序: 0x%x\n", host_long); // 输出:主机字节序: 0x7f000001printf("网络字节序: 0x%x\n", net_long); // 输出:网络字节序: 0x0100007freturn 0;
}

应用场景

  • 发送数据(如 IP 地址或端口号)到网络时,使用 htonl 转换为网络字节序。


相关函数

inet_aton

作用

inet_aton 将一个点分十进制字符串表示的 IPv4 地址转换为网络字节序的二进制形式

函数原型
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
参数
  • cp:点分十进制字符串,如 "127.0.0.1"。

  • inp:指向 struct in_addr 的指针,用于存储转换后的网络字节序地址。

返回值
  • 成功返回非零,失败返回 0。

示例
#include <stdio.h>
#include <arpa/inet.h>int main() {struct in_addr addr;if (inet_aton("127.0.0.1", &addr)) {printf("网络字节序: 0x%x\n", addr.s_addr);} else {printf("转换失败\n");}return 0;
}

ntohl

作用

ntohl(Network TO Host Long)将一个网络字节序的 32 位整数转换为主机字节序

示例
#include <stdio.h>
#include <arpa/inet.h>int main() {uint32_t net_long = 0x0100007f;uint32_t host_long = ntohl(net_long);printf("主机字节序: 0x%x\n", host_long);return 0;
}

htonsntohs

作用
  • htons(Host TO Network Short):将主机字节序的 16 位整数转换为网络字节序

  • ntohs(Network TO Host Short):将网络字节序的 16 位整数转换为主机字节序

示例
#include <stdio.h>
#include <arpa/inet.h>int main() {uint16_t port = 8080;uint16_t net_port = htons(port);printf("网络字节序端口: 0x%x\n", net_port);uint16_t host_port = ntohs(net_port);printf("主机字节序端口: %u\n", host_port);return 0;
}

inet_ntopinet_pton

作用
  • inet_ntop:将网络字节序的地址(支持 IPv4 和 IPv6)转换为字符串。

  • inet_pton:将字符串形式的地址(支持 IPv4 和 IPv6)转换为网络字节序。

示例
#include <stdio.h>
#include <arpa/inet.h>int main() {char str[INET6_ADDRSTRLEN];struct in6_addr ipv6_addr;// IPv6 字符串 -> 网络字节序inet_pton(AF_INET6, "::1", &ipv6_addr);// 网络字节序 -> IPv6 字符串inet_ntop(AF_INET6, &ipv6_addr, str, INET6_ADDRSTRLEN);printf("IPv6 地址: %s\n", str);return 0;
}

总结

函数作用应用场景
inet_ntoa网络字节序 IPv4 转为点分十进制字符串输出人类可读的 IP 地址
inet_aton点分十进制字符串转为网络字节序 IPv4输入 IP 地址
htonl主机字节序 32 位整数转为网络字节序发送数据前
ntohl网络字节序 32 位整数转为主机字节序接收数据后
htons主机字节序 16 位整数(端口号)转为网络字节序发送数据前
ntohs网络字节序 16 位整数(端口号)转为主机字节序接收数据后

http://www.ppmy.cn/ops/143127.html

相关文章

fabric.js

目录 一、在canvas上画简单的图形 二、在canvas上用路径(Path)画不规则图形 三、在canvas上插入图片并设置旋转属性(angle) 四、让元素动起来(animate) 五、图像过滤器(filters)让图片多姿多彩 六、颜色模式(Color)和相互转换(toRgb、toHex) 七、对图形的渐变填充(Gradi…

常用的es操作

前言 我们前面写过ES基础操作和ES高级查询 写的都很细&#xff0c;但是很多时候我们仅仅是忘记具体的某个语法&#xff0c;去那两篇博客查找就很麻烦了&#xff0c;这篇博客就把常用的ES操作进行总结。 常用操作 建索引&#xff08;建表&#xff0c;不过并没有指定字段名和类…

【Qt】信号、槽

目录 一、信号和槽的基本概念 二、connect函数&#xff1a;关联信号和槽 例子&#xff1a; 三、自定义信号和槽 1.自定义槽函数 2.自定义信号函数 例子&#xff1a; 四、带参的信号和槽 例子&#xff1a; 五、Q_OBJECT宏 六、断开信号和槽的连接 例子&#xff1a; …

Java匿名类和lambda

匿名类 匿名类就是一个语法糖&#xff0c;可以帮我们省略定义类名这一步&#xff0c;直接创建对象&#xff0c;简化代码 匿名类规则&#xff1a; 匿名类必须继承一个父类或实现一个接口&#xff0c;并且最多继承一个父类或实现一个接口。匿名类可以继承父类的方法&#xff0c…

基于python绘制数据表(上)

利用python绘制各种数据图表 绘制柱形图-源码 from openpyxl import Workbook from openpyxl.chart import BarChart, Reference# 创建工作薄 wb Workbook(write_onlyTrue) # 创建工作表 ws wb.create_sheet(月收入)# 准备数据 rows [(月份, 销售额),(1, 23),(2, 43),(3, …

第十章 多表查询

一、概述 我们在前面几个章节讲解SQL语句的时候&#xff0c;涉及到了DQL语句即数据查询语句&#xff0c;但是之前讲解的查询都是单表查询&#xff0c;而本章节我们要学习的则是多表查询操作。多表查询‌是指在数据库查询中涉及多个表的操作&#xff0c;通过连接运算来获取多个…

(5)YOLOv3和yolov1、yolov2之间的差异

一、YOLOv3的技术原理和改进 ​ YOLOv3算法是在YOLOv1和YOLOv2的基础上进一步改进和发展的&#xff0c;它在目标检测领域取得了显著的性能提升。YOLOv3成为了一个强大的目标检测工具&#xff0c;广泛应用于各种计算机视觉任务中&#xff0c;包括但不限于图像中的目标检测、视频…

AIDD-人工智能药物设计-ChemDraw Mac版pojie安装

AIDD-人工智能药物设计-ChemDraw Mac版pojie安装 Mac系统12.X版本需要安装chemdraw v20及以上。 https://github.com/Z-H-Sun/CS_CCME_Posts/blob/hidden/cos/cdm2.md 一、准备工作 软件下载地址&#xff1a;https://pan.baidu.com/s/1SDZCriXsxPZvcHMoA7WzUA 提取码&#…