【Linux C | 网络编程】地址结构(sockaddr_in、sockaddr)、字节序转函数(htonl、htons、ntohl,ntohs)、IP转换函数

   日期:2024-12-26    作者:4whu0 移动:http://oml01z.riyuangf.com/mobile/quote/35406.html

😁博客主页😁🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣🍭介绍 🍭
😎金句分享😎🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:2024-01-29 20:30:30
⏰复习时间⏰:2024-02-27 11:35:15

【Linux C | 网络编程】地址结构(sockaddr_in、sockaddr)、字节序转函数(htonl、htons、ntohl,ntohs)、IP转换函数

本文未经允许,不得转发


本文介绍网络编程的一些基础知识。在网络编程中,我们很多时候都需要准备地址结构的,下面先介绍三种需要用到的地址结构以及使用场景。然后介绍网络字节序相关的几个函数。最后再介绍IP地址转换的几个函数。这些知识是网络编程的必备基础知识。


IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以命名,定义在头文件中。结构体定义如下

 
  • :始终设置为。
  • :用表示的端口。
  • :是IP主机地址。结构的成员是表示的IP地址。应被分配一个INADDR_*值(例如,INADDR_ANY,或使用inet_aton、inet_addr、inet_makeaddr库函数进行设置。

使用场景:一般用来构造IPv4的地址结构,然后用于bind、connect等函数。


通用套接字地址结构以命名,定义在头文件中。结构体定义如下

 
    • AF_INET 表示 IPv4
    • AF_INET6 表示IPv6
    • AF_UNIX 表示unix
    • AF_APPLETALK 表示ddp
    • AF_PACKET 表示packet
    • AF_X25 表示x25
    • AF_NETLINK 表示netlink。
  • :协议指定的IP地址、端口等信息。

使用场景:一般不会定义实际变量,只用来做强制转换,将协议指定的套接字地址结构强制转换后传递给需要该地址的套接字函数(如:等)。

使用作为传入参数的函数;作为传出参数的函数:。

为什么需要强制转换?因为不同协议的地址结构不同,但套接字函数却只要一个,所以需要定义一个指针作为参数来使用各个协议的结构体,所以将结构体地址传给套接字函数时需要强制转换成通用套接字地址结构指针()。


IPv6套接字地址结构以命名,定义在头文件中。结构体定义如下

 

使用场景:一般用来构造IPv6的地址结构,然后用于bind、connect等函数。


数据在内存中的存储有两种方式

  • 小端字节序(little-endian):低位字节存储在低位地址
  • 大端字节序(big-endian):低位字节存储在高位地址

网际协议使用大端字节序来传输多字节整数,一般的Linux主机是小端字节序的。这就需要做转换,Linux编程时,可以使用下面4个函数做字节序转换

 

上面几个函数中,表示,表示,表示,表示。
:将一个型数据,从主机字节序转换到网络字节序
:将一个型数据,从主机字节序转换到网络字节序
:将一个型数据,从网络字节序转换到主机字节序
:将一个型数据,从网络字节序转换到主机字节序

的IP地址转换函数inet_aton、inet_addr、inet_ntoa
的IP地址转换函数inet_pton、inet_ntop

inet_aton、inet_addr、inet_ntoa这几个函数可以将的IP地址在和两种形式之间相互转换。

 
  • :将形式IP地址转换为形式的IP地址;

    • 参数
      cp:传入参数,点分十进制的IP地址字符串
      inp:传出参数,用来存储转换后的32位网络字节序IP地址的二进制值
    • 返回值:字符串有效返回1,否则返回0
  • :将形式IP地址转换为形式的IP地址;

    • 参数
      cp:传入参数,点分十进制的IP地址字符串
    • 返回值:字符串有效返回32位网络字节序IP地址的二进制值;无效返回(数值-1),该函数无法转换,因为这个字符串返回也是-1。要避免这个问题的话,可以使用。
  • :将一个32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。

    • 参数
      in:传入参数,32位的网络字节序二进制IPv4地址
    • 返回值:返回:指向一个点分十进制数串的指针

    注意,返回值所指向的字符串驻留在静态内存中。如果其他线程也调用该函数,会修改字符串的值。

例子

 
 

inet_pton、inet_ntop 是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。函数名中和分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构中的二进制值。

 
  • :将src指向的形式IP地址转换为形式的IP地址并存放在dst的内存
    • 参数
      af:表示地址协议,可以是(IPv4),也可以是(IPv6)
      src:传入参数,点分十进制的IP地址字符串
      dst:传出参数,用来存储转换后的数值形式IP地址结果
    • 返回值:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1。
  • :将src指向的形式的IP地址转换为形式IP地址并存放在dst的内存
    • 参数
      af:表示地址协议,可以是(IPv4),也可以是(IPv6)
      src:传入参数,数值形式IP地址
      dst:传出参数,用来存储转换后的结果
      size:是dst指向的内存的大小,以免发生溢出。如果size太小,不足以容纳表达格式结果(包括结尾的空字符),那么返回一个空指针,并置errno为ENOSPC。size的取值参考下面两个宏定义。
       
    • 返回值:若成功则为指向结果的指针,若出错则为NULL。

例子

 
 

👉本文详细介绍Linux系统网络编程的基础知识,包括套接字地址结构(sockaddr_in、sockaddr、sockaddr_in6)、字节序转函数(htonl、htons、ntohl,ntohs)、IP转换函数(inet_aton、inet_addr、inet_ntoa、inet_pton、inet_ntop)。


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号