天天看點

第13章 TCP/IP和網絡程式設計

第13章 TCP/IP和網絡程式設計

目錄

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

  • IPv4 32位位址
  • IPv6 128位位址

第13章 TCP/IP和網絡程式設計

頂層是使用TCP/IP的應用程式,用于登入到遠端主機的ssh,用于交換電子郵件的mail、用于Web頁面的http等應用程式需要可靠的資料傳輸。通常,這類應用程式在傳輸層使用TCP。另一方面,有些應用程式,例如用于查詢其他主機的ping指令,則不需要可靠性。這類應用程式可以在傳輸層使用UDP來提高效率。

計算機可以使用打斷位元組序,也可以使用小段位元組序。在網際網路上,資料是中按網絡序排列,這是大端。在小端機器上,可在主機序和網絡序之間轉換資料。

應用層—>傳輸層—>IP網絡層—>網絡鍊路層

在伺服器 — 客戶機計算模型中,我們首先在伺服器主機上運作伺服器程序。然後,我們從客戶主機運作客戶及。在UDP中,伺服器等待來自客戶機的戶籍包,處理資料包并生成對客戶及的相應。在TCP中,伺服器等待客戶機連接配接。客戶機首先連接配接到伺服器,在客戶機和伺服器之間建立一個虛拟電路。

![image-20211122192647827]

第13章 TCP/IP和網絡程式設計
  • TCP/IP網絡的sin_family始終設定位AF_INET
  • sin_port包含網絡位元組順序排列的端口号。
  • sin_addr是按網絡位元組順序排列的主機IP位址

socket() //船艦一個套接字并傳回一個檔案描述符
           
  • int udp_sock = socket(AF_INET,SOCK_DGRAM,0)
建立一個用于發送/接收UDP資料報的套接字
  • int tcp_sock=socket(AF_INET,SOCK_STREAM,0)
建立一個用于發送/接收資料流的面向連接配接的TCP套接字
int bind(int scokfd,struct sockaddr *addr,socklen_t addrlen)
           

bind()系統調用講addr指定的位址配置設定給檔案毛舒服用引用的套接字

UDP套接字使用sendto()/recvfrom()來發送/接收資料報

第13章 TCP/IP和網絡程式設計
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位址。
           
第13章 TCP/IP和網絡程式設計

h_addr 被定義位一個char *

第13章 TCP/IP和網絡程式設計

代碼連結:https://gitee.com/lhp6666/linux/tree/master/

第13章 TCP/IP和網絡程式設計

問題:對于套接字位址中AF_INET不太了解

解決辦法:通過指令

grep -nr AF_INET /usr/include
grep -nr PF_INET /usr/include
           

查找到

第13章 TCP/IP和網絡程式設計

其代表的是IP協定族

問題:TCP套接字為什麼不能像UDP一樣直接直接在建立套接字後直接發送消息而要在使用listen()accept()connect()函數

解決方法:TCP是面向連接配接的協定,在通信之前需要3此握手建立連接配接,而UDP是無連接配接的協定是以不需要建立連結。更詳細的解釋見部落格

https://blog.csdn.net/qq_20398345/article/details/81132207