以sockaddr_in
命名,定義在中。
typedef uint32_t in_addr_t;
struct in_addr ;
struct sockaddr_in ;
當作為乙個引數傳遞進任何套接字函式時,套接字位址結構總是以引用形式(也就是指向該結構的指標)傳遞。然而以這樣的指標為引數之一的任何套接字函式必須處理來自所支援的任何協議族的套接字位址結構。
標頭檔案中定義了乙個通用的套接字位址結構:
struct sockaddr ;
於是套接字函式被定義為以指向某個通用套接字位址結構的乙個指標作為其引數之一,例如:
int bind(int, struct sockaddr*, socklen_t);
這就要求對這些函式的任何呼叫必須要將指向特定與協議的套接字位址結構的指標進行強制型別轉換,變成指向某個通用套接字位址結構的指標。
我們提到過,當向乙個套接字函式傳遞乙個套接字位址結構時,該結構總是以引用形式來傳遞,該結構的長度也作為乙個引數來傳遞,不過其傳遞方式取決於該結構的傳遞方式:是從程序到核心,還是從核心到程序。
* 從程序到核心傳遞套接字位址結構的函式有3個:bind connect sendto
。這些函式的乙個引數是指向某個套接字位址結構的指標,另乙個引數是該結構的整數大小。例如:
struct sockaddr_in serv;
connet(sockfd, (struct sockaddr*)&serv, sizeof(serv));
struct sockaddr_un cli;
socklen_t len;
len = sizeof(cli);
getpeername(unixfd, (struct sockaddr*)&cli, &len);
我們把某個給定系統所用的位元組序稱為主機位元組序,host byte order
。
#include
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
// 均返回網路位元組序
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net16bitvalue);
// 均返回主機位元組序
我們應該把s
視為乙個16位的值,例如tcp
或udp
埠號,把l
視為乙個32位的值,例如ipv4位址。
#include
int inet_pton(int family, const
char* strptr, void* addrptr);
const
char* inet_ntop(int family, const
void* addrptr, char* strptr, size_t len);
套接字程式設計簡介
這是unp的第三章,主要講了一些基礎的struct以及一些基礎的api,這些struct在後面會一直使用的。ipv4與ipv6的結構儘管不一樣,但類似,連起名都只是ipv6的比ipv4的多來個6,如 struct in6 addr與struct in addr,struct sockaddr in6...
套接字程式設計簡介
struct in addr posix規範只需要這個結構中的3個字段 sin family,sin addr,sin port struct sockaddr in 從核心到程序 為了使套接字函式能夠處理來自所支援的任何協議族的套接字位址結構,在標頭檔案中定義了乙個通用的套接字位址結構,並將指向某...
套接字程式設計簡介
目錄 4.位元組排序函式 5.位址轉換函式 在同一臺主機或裝置上,可能有多個程序同時在使用tcp或udp協議,埠號的作用就是區分這些不同的程序,即每個程序使用各自不同的埠號。對於tcp協議和udp協議,埠號都是用unsigned short型別表示,即埠號的範圍為0 65535,這65536個埠號被...