Linux(十七)網絡基礎:網絡編程套接字

理解源IP地址和目的IP地址

在IP數據包頭部中,有兩個IP地址,分別叫做源IP地址,和目的IP地址

認識端口號

端口號是傳輸層協議的內容
端口號是一個2字節十六位的整數
端口號用來標識一個進程,告訴操作系統,當前的這個數據要交給哪一個進程來處理;
IP地址+端口號能被標識網絡上的某一臺主機的某一個進程
一個端口號只能被一個進程佔用
一個進程可以綁定多個端口號,但是一個端口號不能被多個進程綁定

理解源端口號和目的端口號

傳輸層協議的數據段中有兩個端口號,分別叫做原端口號和目的端口號,就是在描述數據是誰的,要發給誰

認識TCP協議

傳輸層協議
有鏈接
可靠傳輸
面向字節流
認識UDP協議
傳輸層協議
無連接
不可靠傳輸
面向數據報

套接字

在這裏我們就可以知道網絡端口號加上IP地址就構成了我們所說的套接字

網絡字節序

我們已經知道,內存中的多字節數據相對於內存地址有大端和小端之分,磁盤文件中的多字節數據相對於文件中的偏移地址也有大端小端之分,網絡數據流同樣有大端小端之分,那麼如何定義網絡數據流的地址
*發送主機通常將發送緩衝區中的數據按內存地址從低到高的順序發出;
*接收主機把從網絡上街道的字節一次保存在接收緩衝區中,也是按照內存地址從低到高的順序保存;
*因此,網絡數據流地址應該是這樣規定的:先發出的數據是低地址,後發出的數據是高地址;
*TCP/IP協議規定,網絡數據流應採用大端字節序,即低地址高字節
*不管這臺主機是大端機還是小端機,都會按照這個TCP/IP規定的網絡字節序來發送/接收數據
*如果當前發送主機是小端,就需要先將數據轉化成大端;否則就忽略,直接發送就可以了

爲了使網絡程序具有可移植性,使同樣的C代碼在大端和小段計算機上編譯後都能正常運行,可以調用以下庫函數做網絡字節序和主機字節序的轉換。

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

*h表示Host,n表示Network,l表示32爲長整數,s表示16位短整數
*例如htonl表示將32爲的長整數從主機字節序轉換爲網絡字節序,例如將IP地址轉換後準備發送
*如果主機是小端字節序,這些函數將參數做相應的大小端轉換後返回
*如果主機是大端字節序,這些函數不做轉換,將參數直接返回

socket編程接口

//創建socket文件描述符(TCP/UDP,客戶端+服務器)

int socket(int domain,int type,int protocol);

//綁定端口號(TCP/UDP,服務器)

int bind(int socket,const struct sockaddr *address,socklen_t address_len);

//開始監聽socket(TCP,服務器)

int listen(int socket,int backlog);

//接收請求(TCP,服務器)

int accept(int socket,struct sockaddr *address,socklen_t *address_len);

//建立連接(TCP,客戶端)

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

sockaddr結構
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
雖然socket API的接口是sockaddr,但是我們真正在基於IPv4編程時,使用的結構是sockaddr_in;這個結構裏主要有三部分信息:地址類型,端口號,IP地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章