zoukankan      html  css  js  c++  java
  • 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 
    ", ip1);
        
        struct in_addr ip2;
        int iResult = inet_aton("127.0.0.1",&ip2); 
        printf("ip2:%d,iResult:%d 
    ", 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 ", szValue1); char* szValue2 = inet_ntoa(myAddr2); printf("address2: %s ", szValue2); printf("address1: %s ", 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 
    ", ip1);
    
        
    (网络字节序表示的ipv4地址)整数,转为 (点分十进制的)ip地址字符串:
        struct in_addr myAddr1;
        char* szValue1 = inet_ntoa(myAddr1);
        printf("address2: %s 
    ", szValue2); 


  • 相关阅读:
    安装mysql_cluster报错: Data::Dumper丢失
    win10 nodejs指定ionic版本安装(npm方式)
    java项目报错: org.springframework.beans.factory.BeanCreationException找不到mapper.xml文件
    java项目跑起来报错: 程序报 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 错误
    ~/.bashrc文件写错, 导致Linux全部命令丢失
    tomcat热启动没问题, 访问项目报500解决办法
    安装OpenOffice
    redhat6.4 elasticsearch1.7.3安装配置
    MySQL新建用户保存的时报错:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
    zabbix zabbix_agentd.conf详解
  • 原文地址:https://www.cnblogs.com/music-liang/p/11906744.html
Copyright © 2011-2022 走看看