套接字程式設計簡介

2021-08-08 09:36:23 字數 2322 閱讀 6333

struct in_addr ;

/*posix規範只需要這個結構中的3個字段:sin_family,sin_addr,sin_port*/

struct sockaddr_in ;

從核心到程序

為了使套接字函式能夠處理來自所支援的任何協議族的套接字位址結構,在標頭檔案中定義了乙個通用的套接字位址結構,並將指向某個套接字位址結構的乙個指標作為其引數之一:

struct sockaddr ;
struct in6_addr ;

#define sin6_len /* required for compile-time tests */

struct sockaddr_in6 ;

說明:1)sin6_flowinfo欄位分為兩部分,低20位是流標(flowlabel),高12位保留;2)對於具備範圍的位址(scoped address),sin6_scope_id欄位標識其範圍,最常見的是鏈路區域性位址的介面索引。

作為ipv6套接字api的一部分而定義的新的通用套接字位址結構struct sockaddr_storage足以容納系統支援的任何套接字位址結構,定義在標頭檔案中:

小端(litle-endian)位元組序大端(big-endian)位元組序;主機位元組序、網路位元組序。

術語「小端」和「大端」表示多個位元組值的哪一端儲存在該值的起始位址。

#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);

名字以b(表示位元組)開頭的源自berkeley的函式定義在標頭檔案中:

名字以mem(表示記憶體)的源自ansi c標準的函式定義在標頭檔案中:

注意:當源位元組串與目標位元組串重疊時,bcopy能夠正確處理,但是memcpy的操作結果卻不可知。這時必須改用ansi c的memmove函式。

inet_addr函式在出錯時返回inaddr_none常值,通常是乙個32位均為1的值。這意味著點分十進位制數串「255.255.255.255」(ipv4的有限廣播位址)不能由該函式處理。

inet_ntoa函式返回值指向的字串駐留在靜態記憶體中,因此該函式是不可重入的。

這兩個函式是隨ipv6出現的新函式,對於ipv4位址和ipv6位址都適用。

在標頭檔案中定義了兩個常量,便於指定引數len

通配位址

位元組流套接字、非阻塞套接字

readwrite函式和errno變數

防禦性程式設計(defensive programming)

當需要從某個套接字讀入文字行時,為了提公升效能可以使用標準i/o函式庫(stdio)。不過需要指出這是種危險的做法,因為stdio緩衝區的狀態是不可見的,可能導致應用程式中存在相當隱蔽的缺陷。

基於文字行的網路協議有很多,如smtp、http、ftp的控制連線協議以及finger等。

套接字程式設計簡介

這是unp的第三章,主要講了一些基礎的struct以及一些基礎的api,這些struct在後面會一直使用的。ipv4與ipv6的結構儘管不一樣,但類似,連起名都只是ipv6的比ipv4的多來個6,如 struct in6 addr與struct in addr,struct sockaddr in6...

套接字程式設計簡介

以sockaddr in命名,定義在中。typedef uint32 t in addr t struct in addr struct sockaddr in 當作為乙個引數傳遞進任何套接字函式時,套接字位址結構總是以引用形式 也就是指向該結構的指標 傳遞。然而以這樣的指標為引數之一的任何套接字函...

套接字程式設計簡介

目錄 4.位元組排序函式 5.位址轉換函式 在同一臺主機或裝置上,可能有多個程序同時在使用tcp或udp協議,埠號的作用就是區分這些不同的程序,即每個程序使用各自不同的埠號。對於tcp協議和udp協議,埠號都是用unsigned short型別表示,即埠號的範圍為0 65535,這65536個埠號被...