歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 套接字地址結構以及地址轉換函數

套接字地址結構以及地址轉換函數

日期:2017/3/3 12:45:53   编辑:Linux技術

套接字地址結構

ipv4地址結構

[code]#include <netinet/in.h>

struct in_addr {
    in_addr_t s_addr;
}

struct sockaddr_in{
    uint8_t sin_len;       //套接字地址結構的字節長度
    sa_family_t sin_family; //地址協議簇,unsigned short
    in_port_t sin_port;    //端口, 2 Bytes
    struct in_addr sin_addr;  //ipv4地址,4Bytes
    char sin_zero[8];     //用於定義額外的結構字段,至少8 Bytes,具體實現看廠商
}

ipv6地址結構

[code]#include <netinet/in.h>
struct in6_addr {
    uint8_t s6_addr[16];
}

#define SIN6_LEN; //如果系統支持套接字結構的長度字段,該宏必須定義

struct sockaddr_in6 {
    uint8_t sin6_len;       //套接字地址結構的字節長度
    sa_family_t sin6_family; //地址協議簇,unsigned short
    in_port_t sin6_port;    //端口, 2 Bytes
    uint32_t sin6_flowinfo;
    struct in6_addr sin6_addr;  //ipv6地址,16 Bytes
    uint32_t sin6_scopt_id;
}

地址轉換函數

地址轉換函數主要的作用是:ip字符串與網絡字節序之間的轉換。有以下函數:
[code]#include <arpa/inet.h>
//以下兩個函數只用於ipv4地址
int inet_aton(const char *strptr, struct in_addr *addr);
char *inet_ntoa(struct in_addr addr);

//以下兩個函數可用於ipv4和ipv6地址
int inet_pton(int family, const char *strptr, void *addrptr);
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

ipv4地址轉換

[code]#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addr);
char *inet_ntoa(struct in_addr addr);
因為這兩個函數是只支持ipv4地址轉換,所以使用到了in_addr這個結構體。

第一個函數字符串若字符串有效則返回1,否則返回0。

第二函數返回指向字符串的指針,而且該指針是指向一個靜態內存當中(系統預先定義靜態數組,inet.h頭文件中寫道:The return value is a pointer to an internal array containing the string),所以所有使用這個函數的返回結構都指向同一個空間,所以該函數不可重入。第二函數參數不是以指針形式傳入。

通用轉換

[code]#include <arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
這兩個函數傳入的地址結構要麼是in_addr,要麼是in6_addr,具體根據family決定。

inet_pton成功返回1,若輸入不是有效就返回0,出錯返回-1。

-inet_ntop成功返回指向結構的指針,出錯返回NULL。

需要注意的是,inet_ntop的第三個參數strptr不能是空指針,它需要調用者事先申請一段空間,地址如果轉換成功,轉換後的字符串地址就存儲在該段空間內,並且返回指向該空間的地址。這樣就可以避免inet_ntoa的不可重入問題。

Copyright © Linux教程網 All Rights Reserved