Linux C网络地址格式转换demo

in_addr sockaddr sockaddr_in结构体

typedef unsigned char           __uint8_t;
typedef short                   __int16_t;
typedef unsigned short          __uint16_t;
typedef int                     __int32_t;
typedef unsigned int            __uint32_t;
typedef long long               __int64_t;
typedef unsigned long long      __uint64_t;

typedef __uint8_t               sa_family_t;
typedef __uint16_t              in_port_t;

typedef __uint32_t      in_addr_t;      /* base type for internet address */

struct in_addr {
	in_addr_t s_addr;
};

struct sockaddr {
	__uint8_t       sa_len;         /* total length */
	sa_family_t     sa_family;      /* [XSI] address family */
	char            sa_data[14];    /* [XSI] addr value (actually larger) */
};

struct sockaddr_in {
	__uint8_t       sin_len;
	sa_family_t     sin_family;
	in_port_t       sin_port;
	struct  in_addr sin_addr;
	char            sin_zero[8];
};

typedef struct in6_addr {
	union {
		__uint8_t   __u6_addr8[16];
		__uint16_t  __u6_addr16[8];
		__uint32_t  __u6_addr32[4];
	} __u6_addr;                    /* 128-bit IP6 address */
} in6_addr_t;

struct sockaddr_in6 {
	__uint8_t       sin6_len;       /* length of this struct(sa_family_t) */
	sa_family_t     sin6_family;    /* AF_INET6 (sa_family_t) */
	in_port_t       sin6_port;      /* Transport layer port # (in_port_t) */
	__uint32_t      sin6_flowinfo;  /* IP6 flow information */
	struct in6_addr sin6_addr;      /* IP6 address */
	__uint32_t      sin6_scope_id;  /* scope zone index */
};

/***********************************基本数据类型****************************/
typedef __uint8_t               sa_family_t;
typedef __uint16_t              in_port_t;

typedef __uint32_t      in_addr_t;      /* base type for internet address */

struct in_addr {
	unsigned int s_addr;
};

struct sockaddr {
	unsigned char       sa_len;         /* total length */
	unsigned char      sa_family;      /* [XSI] address family */
	char            sa_data[14];    /* [XSI] addr value (actually larger) */
};

struct sockaddr_in {
	unsigned char       sin_len;
	unsigned char      sin_family;
	in_port_t       sin_port;
	struct  in_addr sin_addr;
	char            sin_zero[8];
};

typedef struct in6_addr {
	union {
		unsigned char    __u6_addr8[16];
		unsigned short   __u6_addr16[8];
		unsigned int   __u6_addr32[4];
	} __u6_addr;                    /* 128-bit IP6 address */
} in6_addr_t;

struct sockaddr_in6 {
	unsigned char       sin6_len;       /* length of this struct(sa_family_t) */
	unsigned char      sin6_family;    /* AF_INET6 (sa_family_t) */
	in_port_t       sin6_port;      /* Transport layer port # (in_port_t) */
	unsigned int      sin6_flowinfo;  /* IP6 flow information */
	struct in6_addr sin6_addr;      /* IP6 address */
	unsigned int      sin6_scope_id;  /* scope zone index */
};

inet_ntoa inet_aton inet_addr inet_pton inet_ntop

demo


#include <stdio.h>
//#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

int main(int argc, const char * argv[])
{
    /*
     * 字符串IP:192.168.8.217
     * 十进制:3232237785
     * 16进制:0xC0A808D9
     */
    char szStrIp[] = "192.168.8.217";
    unsigned int ulIp = 3232237785;
    printf("ip: %s, dec: %u, little-endian-hex: %#x, big-endian-hex: %#x\n", szStrIp, ulIp, ulIp, htonl(ulIp));
    char *pcTmp = NULL;
    int lRet = 0;
    sockaddr stSockAddr = {0};
    //sockaddr_in stSockAddrIn = {0};
    //sockaddr_in6 stSockAddrIn6 = {0};
    
    in_addr stInAddr = {0};
    stInAddr.s_addr = inet_addr("192.168.8.217");
    pcTmp = inet_ntoa(stInAddr);
    printf("inet_ntoa, ret: %s, s_addr: %#x.\n", pcTmp, stInAddr.s_addr);
    
    /** inet_addr 处理255.255.255.255以及错误的ip返回的结果为0xffffffff
     */
    stInAddr.s_addr = inet_addr("259.255.255.255");
    printf("inet_addr s_addr: %#x.\n", stInAddr.s_addr);
    
    char szIp[INET_ADDRSTRLEN] = "192.168.8.217";
    in_addr stOutAddr = {0};
    lRet = inet_aton(szIp, &stOutAddr);
    printf("inet_aton ret: %d, ip: %s, s_addr: %#x.\n", lRet, szIp, stOutAddr.s_addr);

    in_addr stAddr2 = {0};
    char szIp2[INET_ADDRSTRLEN] = "192.168.8.217";
    // 文本字符串格式转换成网络字节序的二进制地址
    lRet = inet_pton(AF_INET, szIp2, &stAddr2);
    printf("inet_pton ret: %d, ip: %s, s_addr: %#x.\n", lRet, szIp2, stAddr2.s_addr);
    
    const char *pcTmp2 = NULL;
    memset(szIp2, 0, sizeof(szIp2));
    // 网络字节序的二进制地址转换成文本字符串格式
    pcTmp2 = inet_ntop(AF_INET, &stAddr2, szIp2, INET_ADDRSTRLEN);
    printf("inet_ntop ret: %s, ip: %s.\n", pcTmp2, szIp2);
    return 0;
}

运行结果

# MacOS Big Sur 11.1
# Intel Core i5
ip: 192.168.8.217, dec: 3232237785, little-endian-hex: 0xc0a808d9, big-endian-hex: 0xd908a8c0
inet_ntoa, ret: 192.168.8.217, s_addr: 0xd908a8c0.
inet_addr s_addr: 0xffffffff.
inet_aton ret: 1, ip: 192.168.8.217, s_addr: 0xd908a8c0.
inet_pton ret: 1, ip: 192.168.8.217, s_addr: 0xd908a8c0.
inet_ntop ret: 192.168.8.217, ip: 192.168.8.217.
Program ended with exit code: 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值