套接字程式設計基礎 Unix網路程式設計第3章總結

2021-06-03 05:21:44 字數 2576 閱讀 9162

1.套接字位址結構

以下是其posix定義:

struct in_addr 

struct sockaddr_in

在rhel5中,in_addr_t是無符號32位整數,in.h檔案中包含 typedef unit32_t in_addr_t;  posix規範只有sin_family,sin_port和sin_addr是必須的。

通用套接字位址結構

套接字函式(指的是套接字位址結構作為引數的函式)必須支援任何協議族的套接字位址結構,在呼叫這些函式的過程中必須將套接字位址結構強制轉化成通用套接字位址結構,如下bind函式ansi c原型:

int bind(int, struct sockaddr *, socklen_t);
struct sockaddr_in ipv4_addr;       /*ipv4套接字位址*/  

bind(connfd, (struct sockaddr *)&ipv4_addr, sizeof(ipv4_addr)); /*繫結指定的ipv4位址*/

struct in6_addr 

#define sin6_len /*若系統支援套接字位址結構中的長度字段,那麼sin6_len常值必須定義*/

struct sockaddr_in6

新通用套接字位址結構

struct sockaddr_addr{}

2. value--result引數

當向乙個套接字函式傳遞乙個套接字位址結構時,通常是以引用(指標)的方式傳遞,同時該結構的長度也作為乙個引數傳遞。根據其傳遞方向可分成從進到核心和從核心到程序。

struct  sockaddr_in  serv;

...connect(sockfd, (struct sockaddr *)&serv, sizeof(serv));

這樣指標和指標所指向內容的大小都傳遞給了核心,核心便可以從程序獲取完整套接字位址結構資料。

2.2 從核心到程序傳遞套接字位址結構的函式有:accept、recvfrom、getsockname和getpeername。這些函式其中兩個引數是指向套接字位址結構的指標和表示該結構的整數變數的指標。例如:

struct sockaddr_un  cli;  /*unix域*/   

socklen_t len;

len = sizeof(cli);

getpeername(unixfd, (struct sockaddr *)&cli, &len);

/*len 可能會改變*/

由於unix域的套接字位址結構長度是可變的,所以需要將位址結構的長度以指標方式傳遞,因為當函式被呼叫時,結構大小是乙個值(value),它告訴核心該結構大小,這樣核心在寫該結構時不至於越界;當函式返回時,結構大小又是乙個結果(result),它告訴程序該位址結構究竟儲存了多少資訊。

3. 位元組排序函式

主機位元組序分為小端位元組序和大端位元組序。 但網路協議必須指定網路位元組序,於是有以下函式實現主機位元組序和網路位元組序的轉換:

/*主機位元組序到網路位元組序,返回網路位元組序的值*/

uint16_t htons(uint16_t host16bitvalue);

uint32_t htonl(uint32_t host32bitvalue);

/*網路位元組序到主機位元組序,返回主機位元組序的值*/

uint16_t ntohs(uint16_t net16bitvalue);

uint32_t ntohl(uint32_t net32bitvalue);

在函式名中,h(host),n(network),s(short),l(long)。在使用這些函式時,並不需要關心主機位元組序和網路位元組序的真實值(大端或小端),只需要呼叫適當的函式在主機和網路位元組序之間轉換。

4. 位址轉換函式

4.1 只適用ipv4函式

inet_aton、inet_addr和inet_ntoa在點分十進位制和長度為32位的網路位元組序二進位制之間轉換。inet_addr實現功能與inet_aton相同,但現在已經棄用。

#include /*若字元有效返回1,否則為0*/

int inet_aton(const char *strptr, struct in_addr *addrptr);

/*返回乙個點分十進位制的指標*/

char * inet_ntoa(struct in_addr inaddr);

4.2 適用於ipv4和ipv6

#include /*成功則返回1; 若輸入格式不正確則為0; 若出錯則為-1*/

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

/*若成功則返回指向結果的指標,若出錯則為null*/

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

UNIX網路程式設計 基礎套接字程式設計

就像 unix網路程式設計 裡面說的,我們可以將tcp的連線看成乙個 系統,那麼我們的套接字位址結構,就是我們的 裡面號碼,和其他能確定我們身份資訊的集合。其中ipv4的,我們已經很熟悉,還有另外的,在ipv6如果系統支援長度字段,那麼sin6 len常值必須定義,在使用這一結構時我們必須分清到底,...

UNIX網路程式設計 套接字程式設計介紹

列印當前機器是小頭派還是大頭派型別 注意,如果沒有加這兩個標頭檔案 include include 編譯時候會報 警告 隱式宣告與內建函式 printf 不相容 這個錯誤 編譯 gcc o byteorder byteorder.c include include int main int argc...

UNIX網路程式設計 基本TCP套接字程式設計

一 基於tcp協議的網路程式 下圖是基於tcp協議的客戶端 伺服器程式的一般流程 伺服器呼叫socket bind listen 完成初始化後,呼叫accept 阻塞等待,處於監聽埠的狀態,客戶端呼叫socket 初始化後,呼叫connect 發出syn段並阻塞等待伺服器應答,伺服器應答乙個syn ...