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

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM