• 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); 


  • 相关阅读:
    Windows共享作为公司文件服务器的案例
    关于限制域用户登陆计算机的几点总结
    防止加入域主机脱离域的控制(管理员权限)
    域组策略禁止执行指定软件
    域用户执行金蝶K/3报错解决方法
    WinXP/Win7/Win8本地用户配置文件迁移至域用户
    Windows批处理:请求远程协助
    浅谈JavaScript闭包
    新蛋那几月
    JavaScript 32位整型无符号操作
  • 原文地址:https://www.cnblogs.com/music-liang/p/11906744.html
Copyright © 2020-2023  润新知