如何将字符数串和IP地址进行转换?

本文详细介绍了网络编程中涉及的IP地址结构体,包括struct sockaddr、struct sockaddr_in、struct in_addr和struct sockaddr_in6等,并列举了它们的成员变量。同时,讲解了IPv4和IPv6的转换函数,如inet_aton、inet_addr、inet_ntoa、inet_pton和inet_ntop的使用。通过代码示例展示了如何将点分十进制IP字符串转换为结构体以及反向转换的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一部分主要是网络编程中会使用,将数串和IP地址进行转换,在进行转换之前,我们需要知道IP地址在linux系统中的结构体定义

地址类型结构体

具体如下表:

结构体功能特性
struct sockaddr套接字地址结构IPv4/IPv6通用
struct sockaddr_inIPv4套接字地址结构IPv4专用
struct in_addrIPv4地址结构IPv4专用
in_addr_tIPv4地址类型IPv4专用
truct sockaddr_in6IPv6套接字地址结构IPv6专用

这些地址中具体包含的变量有:

  • 套接字地址结构
struct sockaddr {
    unsigned short sa_family; // 套接字地址簇类型,为AF_INET
    char sa_data[14];         // 套接字地址数据(14位的协议地址)
};
  • IPv4套接字地址结构
struct sockaddr_in{
    short sin_family;         // 套接字地址簇类型,为AF_INET
    unsigned short sin_port;  // 端口号,网络字节序
    struct in_addr sin_addr;  // IP地址,网络字节序
    unsigned char sin_zero[8];// 填充字节
};
  • IPv4地址结构
struct in_addr {
    in_addr_t s_addr;
};
  • IPv4地址类型
typedef unsigned int in_addr_t;
  • IPv6套接字地址结构
struct sockaddr_in6{
   uint8_t sin6_len;           //IPv6 为固定的24 字节长度
   sa_family_t sin6_family;    //套接字地址簇类型,为AF_INET6
   in_port_t sin6_port;        //16 位端口号,网络字节序
   uint32_t sin6_flowinfo;     //32 位流标签
   struct in6_addr sin6_addr;  //128 位IP地址
}

转换函数

函数功能特点
int inet_aton(const char string, struct in_addraddr)点分十进制数串转网络字节序长整型IPv4专用
in_addr_t inet_addr(const char* string)点分十进制数串转网络字节序长整型IPv4专用
char* inet_ntoa(struct in_addr addr)网络字节序长整型转点分十进制数串IPv4专用
int inet_pton(int af, const char *src, void *dst)点分十进制数串转网络字节序长整型IPv4/IPv6通用(推荐)
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)网络字节序长整型转点分十进制数串IPv4/IPv6通用(推荐)

代码举例

我们首先定一个char型字符串,然后将该字符数串转化为IP地址类型,具体代码如下:

#include <iostream>
#include <cstring>
#include <arpa/inet.h>

using namespace std;

int main(){
    const char* ip = "127.0.0.1";
    struct in_addr addr;
    int res = inet_aton(ip,&addr);
    if(res == 0){
        perror("inet_Aton error");
    }

    cout << addr.s_addr << endl;
    cout << inet_ntoa(addr) << endl;
    cout << inet_ntoa(addr) << endl;
}

运行结果如下:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值