Linux网络编程:IP地址的字符串与网络字节序转换:inet_addr()、inet_aton()、inet_ntoa()、inet_pton()、inet_ntop()

这篇具有很好参考价值的文章主要介绍了Linux网络编程:IP地址的字符串与网络字节序转换:inet_addr()、inet_aton()、inet_ntoa()、inet_pton()、inet_ntop()。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IP地址的字符串与网络字节序转换

向sockaddr_in注入地址时,需要将ip地址的字符串形式转化为网络字节序的形式;而相反地,网络字节序也能转化回字符串形式。用到的函数分别inet_addr()、inet_aton()、inet_ntoa()、inet_pton()、inet_ntop(),转化的方向如下图。

linux inet_addr,网络,linux,tcp/ip

1 inet_addr()

#include <arpa/inet.h>
in_addr_t inet_addr(const char *ip);
  • 功能:是将一个点分十进制ipv4的IP地址转换32位大端网络字节序整数
  • 参数:点分十进制的ip地址字符串ip
  • 返回值:成功时返回32位大端整数,失败返回INADDR_NONE

2 inet_aton()和inet_ntoa()

inet_addr()直接返回结果,而inet_aton()将转换结果直接写入传入的参数中,方便向sockaddr_in注入IP地址。
记法:ASCII to network / network to ASCII

inet_aton()
#include <arpa/inet.h>
int inet_aton(const char *ip, struct in_addr *addr);
  • 功能:是将一个点分十进制的ipv4的IP地址转换32位大端网络字节序整数,结果直接填入in_addr中,使用频率比inet_addr()多。
  • 参数:
  1. string: 点分十进制的ip地址字符串ip
  2. addr: 属于sockaddr_in结构体的结构体in_addr地址
  • 返回值:成功时返回1,失败返回0
inet_ntoa()
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr *addr );
  • 功能:是将一个32位大端网络字节序整数转换为点分十进制的ipv4的IP地址。
  • 参数:
  1. addr: 属于sockaddr_in结构体的结构体in_addr地址
  • 返回值:存放转化结果的首地址,char*指针,要提前分配空间。失败时返回-1。

3 inet_pton()inet_ntop()

前面的只适用于ipv4地址,这两个适用于ipv4和ipv6,因此使用时要指定地址族
记法:presentation to numeric / numeric to presentation

inet_pton()
#include <arpa/inet.h>
int inet_pton(int af, const char *ip, void *dst);
  • 功能:将ipv4或者ipv6的字符串ip地址转换为大端网络字节序整数
  • 参数:
  1. af: 地址族,取值为AF_INET和AF_INET6,分别ipv4和ipv6
  2. ip:要转化的ip字符串首地址
  3. dst:接收转化后大端网络字节序整数结果的地址,ipv4可以用sin_addr
  • 返回值:如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和ip格式不对,函数将返回0。
inet_ntop()
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
  • 功能:将为大端网络字节序整数转换为ipv4或者ipv6的字符串ip地址
  • 参数:
  1. af: 地址族,取值为AF_INET和AF_INET6,分别ipv4和ipv6
  2. src:大端网络字节序整数首地址地址,ipv4可以用sin_addr
  3. dst:接收转化后的ip地址字符串首地址(缓冲区)
  4. cnt:dst缓冲区大小
  • 返回值:
    如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC。若无错误发生,Inet_ntop()函数返回一个指向缓冲区的指针。

例程

代码
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <netinet/in.h>  
#include <sys/socket.h>  
#include <sys/types.h>  
#include <arpa/inet.h>
int main()  
{  
    char ip1[] = "192.168.0.74";  
    char fakeip[] = "192.256.0.74";
    struct sockaddr_in addr_inet;
/*
    inet_addr()
*/
    printf("ip %s converting\n",ip1);
    unsigned long net_ordered_addr = inet_addr(ip1);
    if(net_ordered_addr == INADDR_NONE)
    {
        printf("inet_addr() error\n\n");
    }else{
        printf("inet_addr() success: network ordered integer addr: %#x \n\n",
            net_ordered_addr);
    }
    // fake ip
    printf("fake ip %s converting\n", fakeip);
    net_ordered_addr = inet_addr(fakeip);
    if(inet_aton(fakeip,&addr_inet.sin_addr)==0)
    {
        printf("inet_addr() error\n\n");
    }else{
        printf("inet_addr() success: network ordered integer addr: %#x \n\n",
            net_ordered_addr);
    }
/*
    inet_aton() and inet_ntoa()
*/
    printf("ip %s converting\n",ip1);
    if(inet_aton(ip1,&addr_inet.sin_addr)==0)
    {
        printf("inet_aton() error\n\n");
    }else{
        printf("inet_aton() success: network ordered integer addr: %#x \n\n",
            addr_inet.sin_addr.s_addr);
    }
    printf("network odered addr %#x converting\n",addr_inet.sin_addr.s_addr);
    char *ip_new;
    ip_new = inet_ntoa(addr_inet.sin_addr);
    if(ip_new[0]== -1){
        printf("inet_ntoa() error\n\n");
    }else{
        printf("inet_ntoa() success: ip: %s \n\n", ip_new);
    }
/*
    inet_pton() and inet_ntop()
*/
    char ip2[] = "255.255.255.255";  
    printf("ip %s converting\n", ip2);
    if(!inet_pton(AF_INET, ip2, (void *) &addr_inet.sin_addr))
    {
        printf("inet_pton() error\n\n");
    }else{
        printf("inet_pton() success: network ordered integer addr: %#x \n\n",
            addr_inet.sin_addr);
    }
    
    char ip2_new[16];  //ipv4的字符串长度为16字节
    printf("network odered addr %#x converting\n", addr_inet.sin_addr.s_addr);
    if(!inet_ntop(AF_INET, (void *) &addr_inet.sin_addr, ip2_new, sizeof(ip2_new)))
    {
        printf("inet_pton() error\n\n");
    }else{
        printf("inet_pton() success: ip: %s \n\n", ip2_new);
    }
   
    return 0;
}
结果

linux inet_addr,网络,linux,tcp/ip文章来源地址https://www.toymoban.com/news/detail-769551.html

到了这里,关于Linux网络编程:IP地址的字符串与网络字节序转换:inet_addr()、inet_aton()、inet_ntoa()、inet_pton()、inet_ntop()的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP IP网络编程(三) 地址族与数据序列

    网络地址 IP地址分为两类: IPv4 4字节地址族 IPv6 16字节地址族 IPv4和IPv6的差别主要是表示在IP地址所用的字节数,目前通用的地址族为IPv4,而IPv6是为了应对IP地址耗尽的问题而提出的标准,目前主要还是使用IPv4 IPv4标准的4字节IP地址分为网络地址和主机地址,且分为A、B、C、

    2024年02月10日
    浏览(74)
  • Python网络编程基础之ip地址,端口号,TCP,socket

    IP地址 IP地址 (Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 换而言之,IP 地址就是标识网络中设备的一个地址,好比

    2024年02月02日
    浏览(31)
  • 网络编程1—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 从本篇文章开始就要分享网络编程的内容了,越发的感受到了编程的魅力,鸡汤来喽!! 1️⃣单机阶段:计算机跟计算

    2024年02月12日
    浏览(31)
  • Linux 网络编程学习笔记——一、TCP/IP 协议族

    数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环等)上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。最常用的协议是 ARP(Address Resolve Protocol,地址解析协议)和 RARP(

    2024年02月02日
    浏览(62)
  • Linux网络编程——C++实现进程间TCP/IP通信

    地址接口 1、通用地址接口 共16字节 = 2字节地址类型 + 14字节地址数据 2、自定义地址接口 地址转换 1、需要将点分字符串ip转化为程序ip,使用inet_addr函数: 2、字节序转换 地址接口配置中的端口需要字节序转换,网络规定使用大端字节序。 地址接口配置 1、socket:创建套接

    2024年02月20日
    浏览(37)
  • 【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍多播的概念、多播地址、UDP实现广播的C语言例子 🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

    2024年03月11日
    浏览(39)
  • Linux网络编程之TCP/IP实现高并发网络服务器设计指南

    目录 引言: 多进程服务器 例程分享: 多线程服务器  例程分享: I/O多路复用服务器 select 例程分享: poll 例程分享: epoll 例程分享: 总结建议         随着互联网的迅猛发展,服务器面临着越来越多的并发请求。如何设计一个能够高效处理大量并发请求的服务器成为

    2024年02月20日
    浏览(44)
  • [C++ 网络协议编程] 域名及网络地址

    DNS(Domain Name System):是对IP地址和域名(如:www.baidu.com等)进行相互转换的系统,其核心是DNS服务器。 我们输入的www.baidu.com是域名,是一种虚拟地址,而非实际地址,DNS服务器会将这个虚拟地址转换为实际地址,即IP地址。若我们直接输入IP地址,则不会发生上面的转换。

    2024年02月12日
    浏览(27)
  • 【网络编程·网络层】IP协议

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。  目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和

    2024年02月13日
    浏览(32)
  • 【网络编程】网络层——IP协议

    TCP作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网络中传输的其实是传输层以下的网络层和数据链路层。 双方在进行网络通信时,发送的数据并不是直接从一方的传输层直接发送到了另一方的传输层,

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包