1. 程式人生 > >套介面程式設計函式及定義

套介面程式設計函式及定義

IPv4套介面地址結構:

通常也稱為“網際套介面地址結構” ,以“sockaddr_in”命名

sockaddr_in:

struct in_addr{

in_addr_t s_addr;   /*32-bit IPv4 address*/
};

struct sockaddr_in{

uint8_t sin_len;//長度成員sen_len,但無需設定和檢查

sa_family_t sin_family;  /*AF_INET*/

in_port_t sin_port;  /*16-bit TCP or UDP port number*/

struct in_addr sin_addr;  /*32-bit- IPv4 address*/

char sin_zero[8];  /*unused*/
};

通用套介面地址結構:

sockaddr:

struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family; /*address family:AF_XXX value */
char sa_data[14]; /* protocol-specific address */
};

套介面函式被定義為採用指向通用套介面地址結構的指標:

int bind(int,struct sockaddr* ,socklen_t);

這就要求對這些函式的任何呼叫都必須將指向特定協議的套介面地址結構的指標型別轉換成指向通用套介面地址結構的指標。

例如:

struct sockaddr_in serv;

bind(sockfd,(struct sockaddr*) &serv,sizeof(serv));

如果省略了其中的型別轉換“(struct sockaddr*)",那麼系統會產生警告。

 位元組排序函式:

考慮一個16位整數,由兩個位元組組成。記憶體中儲存這兩個位元組有兩個方法:

1.將低序位元組儲存在起始地址,稱為小端位元組序

2.將高序位元組儲存在起始地址,稱為大端位元組序

ASCII字串與網路位元組序的二進位制值(此值存於套介面地址結構中)間轉換地址

inet_aton  inet_addr   inet_ntoa

在點分十進位制數串(例如:”206.62.226.33“)與它的32位網路位元組序二進位制值間轉換ipv4地址。

int inet_aton(const char* strptr,struct in_addr* addrptr);
//返回:1——串有效,0——串有錯

inet_aton將strptr所指的c字串轉換成32位網路位元組序二進位制值,並通過指標addrptr來儲存

in_addr_t inet_addr(const char* strptr);
//返回:若成功,返回32位二進位制的網路位元組序地址;若出錯,返回INADDR_NONE

inet_addr進行相同的轉換,返回值為32位的網路位元組序二進位制值,但是存在部分ip地址返回出錯的問題。

char * inet_ntoa(struct in_addr inaddr);
//返回:指向點分十進位制數串的指標

將一個32位的網路位元組序二進位制IPv4地址轉換成相應的點分十進位制數串。

inet_pton  inet_ntop

這兩個函式教新,對IPv4和IPv6都能處理。

p代表presentation,n代表numeric。地址的表達(presentation)格式通常是ASCII串,數值(numeric)格式則是存在於套介面地質結構中的二進位制值。

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——出錯