IP地址转换函数

/***********************
《Linux高性能服务器编程》游双  著

*******************************/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

/*************************************
//#include <sys/un.h>
struct sockaddr_un
{
  sa_familiy_t  sin_family;//地址族,AF_UNIX
  char sun_path[108];//文件路径
};

struct sockaddr_in
{
    sa_family_t sin_family;//地址族:AF_INET
    u_int16_t  sin_port;  //端口号,要用网络字节序表示
    struct in_addr  sin_addr;//IPv4地址结构,见下面
};

struct in_addr
{
  u_int32_t s_addr;//IPv4地址,要用网络字节序表示
};

struct sockaddr_in6
{
    sa_family_t sin6_family;//地址族:AF_INET6
    u_int16_t sin6_port;//端口号,要用网络字节序表示
    u_int32_t sin6_flowinfo;//流信息,应设置为0
    struct in6_addr sin6_addr;//IPv6地址结构体,见下面
    u_int32_t  sin6_scope_id;//scope ID,尚处于试验阶段
};

struct in6_addr
{
    unsigned char sz_addr[16];//IPv6地址,要用网络字节序表示
};

*****************************************/

int main()
{

//将用点分十进制字符串表示的IPv4地址转换为网络字节序整数表示的IPv4地址,失败返回INADDR_NONE
// in_addr_t    inet_addr(const char *);

//完成和inet_addr同样的功能,但是将转换结果存储在 inp指向的地址结构中。成功返回1,失败返回0
// int inet_aton(const char( cp, struct in_addr* inp);

//将网络字节序整数表示的IPv4地址转换为用点分十进制字符串表示的IPv4地址。
/////注意,该函数内部用了一个静态变量存储转化结果,函数的返回值指向该静态内存,
//因此 inet_ntoa 是不可重入党。(不能连续调2次,第二次得到的值把地1次的值覆盖了。调用之后,最好把整个值单独取出来)
// char *inet_ntoa(struct in_addr);


// in_addr_t    inet_addr(const char *);
// int inet_aton(const char( cp, struct in_addr* inp);
// char *inet_ntoa(struct in_addr);


    // inet_addr()
    in_addr_t ip1 = inet_addr("1.2.3.4");
    printf("ip1:%d \r\n", ip1);
    
    struct in_addr ip2;
    int iResult = inet_aton("127.0.0.1",&ip2); 
    printf("ip2:%d,iResult:%d \r\n", ip2, iResult);

struct in_addr myAddr1; struct in_addr myAddr2; myAddr1.s_addr = ip1; myAddr2.s_addr = ip2.s_addr; char* szValue1 = inet_ntoa(myAddr1); // printf("address1: %s \r\n", szValue1); char* szValue2 = inet_ntoa(myAddr2); printf("address2: %s \r\n", szValue2); printf("address1: %s \r\n", szValue1); system("pause"); return 0; }
(centos 下面编译运行)运行上面的程序,输出的结果如下:(第一次调用的 inet_ntoa的值被第二次调用的覆盖了)

ip1:67305985 ip2:16777343,iResult:1 address1: 127.0.0.1 address2: 127.0.0.1

 

 

总结一下:

(点分十进制的)ip地址字符串,转为 (网络字节序表示的ipv4地址)整数:
    in_addr_t ip1 = inet_addr("1.2.3.4");
    printf("ip1:%d \r\n", ip1);

    
(网络字节序表示的ipv4地址)整数,转为 (点分十进制的)ip地址字符串:
    struct in_addr myAddr1;
    char* szValue1 = inet_ntoa(myAddr1);
    printf("address2: %s \r\n", szValue2); 

 



posted @ 2019-11-21 17:00  He_LiangLiang  阅读(1137)  评论(0编辑  收藏  举报