inet_XX族函數

在網絡編程中, 常常會將網絡字節轉爲本地字節或者將本地字節轉爲網絡字節, 可是若是每次咱們都是都經過htonl, ntohl函數須要將10進制轉爲整數, 甚至還用將字符串轉爲整數, 再轉爲網絡字節, 或者反過來都是很麻煩的. 還好linux都是提供很方便的函數讓二者之間進行轉換.linux

轉換函數

linux提供了多種函數知足咱們任何轉換的需求, 這都是inet_xxx族系列編程

#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

int inet_aton(const char *ip, struct in_addr *inp); // 本地轉網絡

char * inet_ntoa(struct in_addr inp);   // 網絡轉本地

in_addr_t inet_addr(const char *ip);    // 返回網絡字節

in_addr_t inet_network(const char *ip); // 返回本地字節

接下來咱們來在分析一下這幾個函數安全

1. inet_aton函數

將點分十進制IP轉化爲網絡字節序存放在inp中, 並返回該網絡字節序對應的整數.網絡

int inet_aton(const char *ip, struct in_addr *inp);

失敗 : 返回0.socket

成功 : 返回IP對應的網絡字節序的數.函數

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

// 傳入 127.0.0.1
int main(int argc, char *argv[])
{
    if(argc != 2)
        exit(-1);

    struct in_addr addr;
    if(inet_aton(argv[1], &addr) == 0)
        exit(-1);
    printf("0x%08x\n", addr.s_addr); // 0x0100007f
 
    exit(EXIT_SUCCESS);
}

2. inet_ntoa函數

將一個32位網絡字節序的二進制IP地址轉換成相應的點分十進制的IP地址.線程

char *inet_ntoa(struct in_addr inp);

失敗 : 返回NULL.指針

成功 : 返回字符串指針.code

注意 : 該函數不是線程安全函數, 不可重入. 由於不一樣線程調用會覆蓋掉其餘線程的緩衝區.ip

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char *argv[])
{
    struct in_addr net_addr;
    net_addr.s_addr = 0x0100007f;   // 127.0.0.1
    char *host_addr;

    host_addr = inet_ntoa(net_addr);
    printf("%s\n", host_addr);  // 127.0.0.1
 
    exit(EXIT_SUCCESS);
}

3. inet_addr函數

將一個點分十進制轉換網絡字節序IP.

in_addr_t inet_addr(const char *ip);

失敗 : 返回INADDR_NONE. 部分手冊上返回的是-1, 這個問題與inet_network同樣了.

成功 : 返回網絡字節IP.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

// 輸入 127.0.0.1
int main(int argc, char *argv[])
{
    in_addr_t addr;

    addr = inet_addr(argv[1]);
    printf("0x%08x\n", addr);   // 0x0100007f

    exit(EXIT_SUCCESS);
}

4. inet_network函數

將點分十進制IP轉化爲主機字節序

in_addr_t inet_network(const char *ip);

失敗 : 返回-1.

成功 : 返回主機對應的數.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

// 輸入 127.0.0.1
int main(int argc, char *argv[])
{
    in_addr_t addr;

    addr = inet_network(argv[1]);
    printf("0x%08x\n", addr);   // 0x7f000001
 
    exit(EXIT_SUCCESS);
}

該函數在某些狀況下並不正確, 若是IP地址是255.255.255.255返回的則是0xffffffff, 轉爲十進制就是-1. 分不清出-1表示的是錯誤的返回值仍是IP地址. 可使用inet_pton()inet_ntop()函數來代替, 這裏就不詳細的分析了, 有興趣的能夠本身查一下.

總結

本節分析了4個函數, 重點須要掌握的是inet_aton函數.

  • 4個函數使用, 以及返回值
  • inet_network返回值的問題
  • inet_ntoa並非線程安全的函數
相關文章
相關標籤/搜索