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


  • 相关阅读:
    JDK1.8源码阅读系列之四:HashMap (原创)
    二叉搜索树Java实现(查找、插入、删除、遍历)
    MySQL索引的索引长度问题
    JDK1.8源码阅读系列之三:Vector
    JDK1.8源码阅读系列之二:LinkedList
    JDK1.8源码阅读系列之一:ArrayList
    Java synchronized关键字用法(清晰易懂)
    两栏布局,左边定宽,右边自适应
    css使子元素在父元素居中的各种方法
    基于Vue2、WebSocket的仿腾讯QQ
  • 原文地址:https://www.cnblogs.com/music-liang/p/11906744.html
Copyright © 2011-2022 走看看