計算機網絡——網絡編程套接字

IP協議有兩個版本,IPV4 和IPV6,但若每有特殊說明,默認都是指IPV4.
IP地址是在IP協議中,用來標識網絡中不同主機的地址。
我們光有IP地址就可以完成通信了嘛?有了IP地址能夠把消息發送到對方的機器上,但還是需要有一個其他的標識來區分出,這個程序要給哪個程序進行解析。
認識端口號:
端口號是傳輸層協議的內容:
端口號是一個2字節16位的整數;
端口號用來標識一個進程,告訴操作系統,當前的這個數據要交給哪一個進程來處理;
IP地址+端口號能夠標識網絡上的某一臺主機的某一個進程。
一個端口號只能被一個進程佔用。
網絡字節序:內存中的多字節數據相對於內存地址有大端和小端之分,磁盤文件中的多字節數據相對於文件中的偏移地址也有大端小端之分,網絡數據流同樣有大端小端之分。那麼如何定義網絡數據流的地址呢?
發送主機通常將發送緩衝區中的數據按內存地址從低到高的順序發出。
接收主機把從網絡上接到的字節依次保存在接收緩衝區中,也是按內存地址從低到高的順序保存。因此,網絡數據流的地址應這樣規定:先發出的數據是低地址,後發出的數據是高地址。
Tcp/IP協議規定,網絡數據流應採用大端字節序,即低地址高字節。
不管這臺主機是大端機還是小端機,都會按照這個TCP/IP規定的網絡字節序來發送/接收數據。
如果當前發送主機是小端,就需要先將數據轉成大端;否則就忽略,直接發送即可。
爲使網絡具有可移植性,使同樣的C代碼在大端和小端計算機上編譯後都能正常運行,可以使用一下函數做網絡字節序和主機字節序的轉換。
如果主機是小端字節序,這些函數將參數做相應的大小端轉換然後返回。
如果主機是大端字節序,這些函數不做轉換,將參數原封不動地返回。
socket常見API
//創建socket文件描述符(TCP/UDP,客戶端+服務器)
int socket(int domain,int type,int protocol);
//綁定端口號
int bind(int socket,const struct sockaddr* address, socklen_t address_len);
//接收請求(TCP,服務器)
int accept(int socket,struct sockaddr* address,socklen_t* address_len);
//建立連接(TCP,客戶端)
int connect(int sockfd,const struct ockaddr* addr,socklen_t addrlen);
sockaddr結構
socket API是一層抽象的網絡編程接口,適用於各種底層網絡協議,如IPV4,IPV6,以及後面要將的UNIXDomain Socket,然而,各種網絡協議的地址格式並不相同。
struct sockaddr:16位地址類型,14字節數據。
struct sockaddr_in :16位地址類型:AF_INET,16位端口號,32位IP地址,8字節填充。
struct sockaddr_un: 16位地址類型:AF_UNIX,108字節路徑名。
IPV4和IPV6的地址格式定義在netinet/in.h中,IPV4地址用sockaddr_in結構體表示,包括16位地址類型,16位端口號和32位IP地址。
IPv4.IPV6地址類型分別定義爲常數AF_INET,AF_INET6.這樣,只要取得某種sockaddr結構體的首地址,不需要知道具體是哪種類型的sockaddr結構體,就可以根據地址類型字段確定結構體的內容。
socket API可以都用struct sockaddr*類型表示,在使用的時候需要強制轉化成sockaddr_in,這樣的好處是通用性,可以接收IPv4,IPv6,以及UNIX Domain Socket各種類型的sockaddr結構體指針做爲參數。
地址轉換函數

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