sockaddr資料結構

2021-08-05 21:53:50 字數 1245 閱讀 9787

strcutsockaddr 很多網路程式設計函式誕生早於ipv4協議,那時候都使用的是sockaddr結構體,為了向前相容,現在sockaddr退化成了(void *)的作用,傳遞乙個位址給函式,至於這個函式是sockaddr_in還是sockaddr_in6,由位址族確定,然後函式內部再強制型別轉化為所需的位址型別。

sockaddr資料結構

struct sockaddr in6_u;

#define s6_addr         in6_u.u6_addr8

#define s6_addr16   in6_u.u6_addr16

#define s6_addr32      in6_u.u6_addr32

#define unix_path_max108

struct sockaddr_un {

__kernel_sa_family_t sun_family;    /*af_unix */

char sun_path[unix_path_max];   /*pathname */

pv4和ipv6的位址格式定義在netinet/in.h中,ipv4位址用sockaddr_in結構體表示,包括16位埠號和32位ip位址,ipv6位址用sockaddr_in6結構體表示,包括16位埠號、128位ip位址和一些控制字段。unixdomain socket的位址格式定義在sys/un.h中,用sock-addr_un結構體表示。各種socket位址結構體的開頭都是相同的,前16位表示整個結構體的長度(並不是所有unix的實現都有長度字段,如linux就沒有),後16位表示位址型別。ipv4、ipv6和unix domain socket的位址型別分別定義為常數af_inet、af_inet6、af_unix。這樣,只要取得某種sockaddr結構體的首位址,不需要知道具體是哪種型別的sockaddr結構體,就可以根據位址型別字段確定結構體中的內容。因此,socket api可以接受各種型別的sockaddr結構體指標做引數,例如bind、accept、connect等函式,這些函式的引數應該設計成void *型別以便接受各種型別的指標,但是sock api的實現早於ansi c標準化,那時還沒有void *型別,因此這些函式的引數都用struct sockaddr *型別表示,在傳遞引數之前要強制型別轉換一下,例如:

struct sockaddr_inservaddr;

bind(listen_fd, (structsockaddr *)&servaddr, sizeof(servaddr));        /*initialize servaddr */

sockaddr結構與sockaddr in結構

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...