第13章 TCP/IP和網絡程式設計
目錄
-
- 13.1 TCP/IP協定
- TCP/IP的哥哥層級以及每一層及的代表性元件及其功能
- 13.2 網絡和主機位元組序
- 13.3 TCP/IP網絡中的資料流
- 13.4 網絡程式設計
- 伺服器 — 客戶機計算模型
- 1、套接字位址
- 2、套接字API
- 13.4 主機名和IP位址
- openeuler實踐
- 代碼
- 運作截圖
- 遇到的問題
- 13.1 TCP/IP協定
- IPv4 32位位址
- IPv6 128位位址

頂層是使用TCP/IP的應用程式,用于登入到遠端主機的ssh,用于交換電子郵件的mail、用于Web頁面的http等應用程式需要可靠的資料傳輸。通常,這類應用程式在傳輸層使用TCP。另一方面,有些應用程式,例如用于查詢其他主機的ping指令,則不需要可靠性。這類應用程式可以在傳輸層使用UDP來提高效率。
計算機可以使用打斷位元組序,也可以使用小段位元組序。在網際網路上,資料是中按網絡序排列,這是大端。在小端機器上,可在主機序和網絡序之間轉換資料。
應用層—>傳輸層—>IP網絡層—>網絡鍊路層
在伺服器 — 客戶機計算模型中,我們首先在伺服器主機上運作伺服器程序。然後,我們從客戶主機運作客戶及。在UDP中,伺服器等待來自客戶機的戶籍包,處理資料包并生成對客戶及的相應。在TCP中,伺服器等待客戶機連接配接。客戶機首先連接配接到伺服器,在客戶機和伺服器之間建立一個虛拟電路。
![image-20211122192647827]
- TCP/IP網絡的sin_family始終設定位AF_INET
- sin_port包含網絡位元組順序排列的端口号。
- sin_addr是按網絡位元組順序排列的主機IP位址
socket() //船艦一個套接字并傳回一個檔案描述符
建立一個用于發送/接收UDP資料報的套接字
- int udp_sock = socket(AF_INET,SOCK_DGRAM,0)
建立一個用于發送/接收資料流的面向連接配接的TCP套接字
- int tcp_sock=socket(AF_INET,SOCK_STREAM,0)
int bind(int scokfd,struct sockaddr *addr,socklen_t addrlen)
bind()系統調用講addr指定的位址配置設定給檔案毛舒服用引用的套接字
UDP套接字使用sendto()/recvfrom()來發送/接收資料報
sendto()将緩沖區章的len位元組資料發送到由dest_addr辨別的目标主機。該目标主機包含目标主機IP和端口号。recvfrom()從客戶機主機接收資料。除了資料之外,他還用客戶機的IP和端口号填充src_addr,進而允許伺服器将應答發送回客戶機。
TCP伺服器使用listen()和accept()來接收來自客戶機的連接配接
int listen(int sockfd,int backlog);
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen)
建立連接配接後,兩個TCP主機都可以使用send()/write()發送資料,并使用recv()/read()接收資料,他們唯一的差別是send()和recv()中的flag參數不同,通常情況下可以将其設定位0.
如果打算在不同的主機上運作伺服器和客戶機,伺服器端口号由作業系統核心配置設定,則需要 知道伺服器的主機名或IP位址及其端口号。如果某台計算機運作TCP/IP,他的主機名通常記錄在/etc/hosts/檔案中。庫函數
gethostname(char *name,sizeof(name))
在name數組中傳回計算機的主機名字元串。但是他可能不是用點記法表示的完整正式名稱,也不是其IP位址。庫函數
struct hostent *gethostbyname(void addr,socklen_t len,int typo) //用來擷取計算機全名及其IP位址。
h_addr 被定義位一個char *
代碼連結:https://gitee.com/lhp6666/linux/tree/master/
問題:對于套接字位址中AF_INET不太了解
解決辦法:通過指令
grep -nr AF_INET /usr/include
grep -nr PF_INET /usr/include
查找到
其代表的是IP協定族
問題:TCP套接字為什麼不能像UDP一樣直接直接在建立套接字後直接發送消息而要在使用listen()accept()connect()函數
解決方法:TCP是面向連接配接的協定,在通信之前需要3此握手建立連接配接,而UDP是無連接配接的協定是以不需要建立連結。更詳細的解釋見部落格
https://blog.csdn.net/qq_20398345/article/details/81132207