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

server/2024/12/19 13:49:36/

网络编程中,我们经常需要处理 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/server/151452.html

相关文章

青少年编程与数学 02-004 Go语言Web编程 08课题、使用Gin框架

青少年编程与数学 02-004 Go语言Web编程 08课题、使用Gin框架 一、Gin框架二、接收和处理请求三、应用示例 课题摘要:本文介绍了Gin框架的特点、如何接收和处理请求以及一个应用示例。Gin是一个高性能、轻量级的Go语言Web框架&#xff0c;以其快速、极简设计、强大的路由和中间…

Dockerfile文件编写

目录 Dockerfile文件编写 1.什么是Dockerfile 2. Dockerfile作用 3.dockerfile 的基本结构&#xff1a; 4.dockerfile指令&#xff1a; FROM 指定基础镜像&#xff0c;dockerfile构建镜像的第一个指令 LABEL 指定镜像维护人信息 ADD/COPY 复制本地文件/目录到镜像中 …

React 组件间的通信

React 父传子 实现&#xff1a; function Son(props){return <div>{ props.name }</div> } ​ ​ function App(){const name this is app namereturn (<div><Son name{name}/></div>) } 注意&#xff1a;这里可以传递任何类型&#xff0c;…

C语言 排序

时间:2024.12.18 一、冒泡排序(Bubble Sort) 原理 比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越…

电脑文档损坏:原因剖析和修复方法

在使用电脑的过程中&#xff0c;许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑&#xff0c;特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作&#xff1a; 在编…

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…

Objective-C实现字符串是否是有效的url地址算法(附完整源码)

Objective-C实现字符串是否是有效的url地址算法 要验证一个字符串是否是有效的 URL 地址,可以使用多种方法,包括正则表达式匹配、使用 NSURL 类进行解析等。下面,我将提供一个完整的 Objective-C 实现,包含以下内容: URLValidator 类:包含一个方法 isValidURL: 用于验证字…

计算无人机俯拍图像的地面采样距离(GSD)矩阵

引言 在无人机遥感、测绘和精细农业等领域&#xff0c;地面采样距离&#xff08;Ground Sampling Distance&#xff0c;简称 GSD&#xff09;是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离&#xff0c;通常以米或厘米为单位。GSD 决定了图像的空间…