UNP學習:套接字地址結構

通用套接字地址結構

struct sockaddr
{
    uint8_t     sa_len;
    sa_family_t sa_family; //協議族
    char        sa_data[4];
};

因爲有不同的網絡協議,對於bind函數時,就需要通用的套接字地址結構

IPv4套接字地址結構

struct in_addr
{
    in_addr_t s_addr //32位的ipv4地址(網絡字節序存放)
};

struct sockaddr_in
{
    uint8_t        sin_len;        //結構體長度
    sa_family_t    sin_family;     //AF_INET
    in_port_t      sin_port;       //16位的端口號
    struct in_addr sin_addr;       //32位ipv4地址
};

網絡字節序,主機字節序

網絡字節序就是大端模式。
主機字節序就是主機自己存放模式,即是大端模式,還是小端模式。
因爲在網絡中統一用網絡字節序,所以必要時需要進行網絡字節序與主機字節序的互相轉換。
轉換函數:

#include <netinet/in.h>
//host to network
uint16_t htons(uint16_t host16bitvalue);
unit32_t htonl(uint32_t host32bitvalue);

//netword to host
uint16_t ntohs(uint16_t net16bitvalue);
unit32_t ntohl(uint32_t nett32bitvalue);

點分十進制與二進制IP地址的轉換

對於ipv4地址

#include <arpa/inet.h>

int inet_aton(const char *strptr, struct in_addr *addrptr);

in_addr_t inet_addr(const char *strptr);

char *inet_ntoa(struct in_addr inaddr);
  1. inet_addr函數在出錯是會返回INADDR_NONE,通常是32位均爲1。
  2. inet_ntoa返回再靜態內存中,所以不可以重用
  3. inet_aton將strptr所指向的點分十進制轉成二進制ip地址,並存放在addrptr所指向的內存區域。

ipv4與ipv6都可用

int inet_pton(int family, const char *strptr, void *addrptr);
//成功返回1,若輸入不是有效的表達格式則爲0,出錯返回-1

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
//成功返回指向結果的指針,否則返回NULL
  1. inet_pton:指定了協議族family之後,將點分制strptr,轉爲二進制ip地址,並存放到addrptr所指向內存中。注意這裏addrptr是一個void *指針。
  2. inet_ntop將二進制ip地址轉爲數值格式,二進制ip地址存放在addrptr中,strptr存放的是裝換後的數值格式ip地址,len 表示目標存儲單元大小,一般是strptr的大小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章