Unix網路程式設計(二)套接字位址結構常用函式

2021-06-23 02:27:44 字數 2139 閱讀 2495

註明:本文為學習經驗的總結,絕大部分引用自unix網路程式設計卷一,有錯誤或者交流意見請發郵件至[email protected].非常感謝

記憶體中有兩種方法儲存位元組:一種是將低序位元組儲存在起始位置,稱為小端位元組序。一種是將高序位元組村出來起始位置,稱為大端位元組序。

網際協議使用大端位元組序作為網路位元組序來傳送這些多位元組整數。

以下為主機位元組序與網路位元組序之間轉換的4個函式:

#include 

uint16_t htons (uint16_t host16bitvalue);

uint32_t htonl (uint32_t host32bitvalue);

uint16_t ntohs (uint16_t net16bitvalue);

uint32_t ntohl (uint32_t net32bitvalue);

操縱多位元組欄位的函式既不對資料做解釋也不假設資料是以空字元結尾的c字串。在初始化套接字位址結構,操縱ip位址等等的情況,我們需要使用這些函式。

源自berkeley的函式:

#include 

void bzero(void *dest,size_t nbytes); //初始化

void bcopy(const void *src,void *dest,size_t nbytes); //把指定長度的位元組從src移動到dest處

int bcmp(const void *ptr1, const void *ptr2, size_t nbytes); //比較兩個字串,相等返回0,否則為非0

源自ansi c的函式:

#include 

void* memset(void *dest, int c, size_t len);//初始化

void* memcpy(void* dest, const void *dest, size_t nbytes);

int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);

通常人們喜歡用ascii字串的點分十進位制來表示ip位址,而套接字位址結構中存放的是網路位元組序的二進位制值。因此我們介紹一組網路位址轉換的函式。

#include 

int inet_aton(const char *strptr, struct in_addr *addrptr); //a可以理解成字串,字串有效返回1,否則0.

char* inet_ntoa(struct in_addr inaddr);

in_addr_t inet_addr(const char *strptr);

以下兩個是隨ipv6出現的函式,應盡量使用這兩個函式以保證ipv4與ipv6的相容性。其中p可代表字串,n代表二進位制數值。

#include 

int inet_pton(int family, const char *strptr, void *addrptr);

const char* ntop(int family, const void* addrptr, char *strptr, size_t len);

這兩個函式的family引數可以為af_inet或af_inet6,如果以不被支援的位址族作為引數,則將errno置為eafnosupport錯誤。

第乙個函式成功則返回1,輸入不是有效的表示式則返回0,出錯則返回 -1.

第二個函式必須為strptr分配足夠大小的空間以儲存返回的位址串,引數len則為分配空間的大小,若分配空間大小不夠,則置errno為enospc。若成功則返回指向結構的指標,若出錯則為null。

前兩個函式中必須在引數family中指定位址族,因此要編寫協議無關的**我們開發乙個sock_ntop函式。

函式輸入套接字位址結構及長度,在函式體內分配乙個靜態字串作為輸出。

#include 

#include

#include

char* sock_ntop(const struct sockaddr *sa, socklen_t salen)

}

Unix網路程式設計 1 套接字位址結構

ubuntu usr include netinet in.h includestruct in addr struct sockaddr in sin len 結構體長度字段。sin family 協議族字段。可取的值為 af unix 本地通訊 af inet ipv4 af int6 ipv6...

UNIX網路程式設計 三 套接字位址結構

1.ipv4套接字位址結構 ipv4套接字位址以sockaddr in命名,定義在標頭檔案中。位址結構 struct in addr struct sockaddr in 2.通用套接字位址結構 對於大多數套接字函式 比如 bind,connect,sendto等等 的引數通常是套接字位址結構的引用...

Unix網路程式設計學習筆記 1 套接字位址結構

大多數套接字函式,都需要乙個指向套接字位址結構的指標作為引數,每個協議族都定義了自己的套接字位址結構。這些結構的名字都是以sockadd 開頭,並以對應每個協議族的唯一字尾結尾.ipv4套接字位址結構也稱為 網際套接字位址結構 所以套接字的位址結構名為 sockaddr in in 為 intern...