1. 程式人生 > 實用技巧 >【Linux】網路程式設計套接字socket

【Linux】網路程式設計套接字socket

1.套接字socket程式設計:網路通訊程式的編寫

  • 網路通訊程式的編寫使用的都是套接字介面
  • 網路通訊程式的編寫:TCP/IP五層中應用層是面向程式設計師的一層,應用層的協議都是程式設計師自己訂立,應用層處理完畢後,將資料交給作業系統,進行傳輸層開始往下的封裝
  • 傳輸層的典型協議:UDP/TCP

2.UDP協議和TCP協議的區別

  • UDP協議:使用者資料包協議-----無連線的,不可靠的,面向資料包的一種傳輸方式(無法提供可靠傳輸,但是傳輸速度快)–視訊傳輸
  • TCP協議:傳輸控制協議----基於連線的,可靠的,面向位元組流的一種傳輸方式(提供可靠傳輸,但是傳輸速度較慢)–普通的檔案傳輸

3.UDP通訊程式的編寫

  • 在網路通訊中,都是端與端之間的通訊,兩臺主機的兩個程序間的通訊,並且通訊兩端有一種叫法:

客戶端:通訊兩端中,首先主動發起請求的一端
服務端:通訊兩端中,首先被動接受請求的一端

4.通訊流程

  • server(服務端)
  • 1.在程式中建立套接字—使程序與網絡卡之間通過套接字建立聯絡
  • 2.為套接字繫結地址資訊
    ①地址資訊:IP地址和埠
    ②每一條網路中的資料都要包含:源端IP,PORT,對端IP,PORT
    ③接收端:告訴作業系統發往這個主機的那個埠的資料應該交給我處理
    ④傳送端:告訴作業系統,傳送的這條資料的源端地址是什麼
    ⑤就是在建立套接字建立的socket結構體中描述地址資訊
  • 3.服務端首先接收資料
    ①建立套接字,實際上在核心中建立了一個結構體–socket,socket中會有兩個緩衝區(傳送/接收)
    ②一旦網絡卡接收到資料,這時候作業系統會根據資料中的目的地址資訊,去socket列表中進行匹配,這個資料應該放到誰的接收緩衝區中
    ③接收資料,只是通過接收介面直接從指定的socket接收緩衝區中取出資料
  • 4.傳送資料:將資料放到指定socket的傳送緩衝區中,作業系統會在何時的時候,從緩衝分割槽中取出資料進行封裝,最後傳輸出去
  • 5.關閉套接字,釋放資源
  • client(客戶端)
  • 1.建立套接字,在核心中建立socket結構體
  • 2.為套接字繫結地址資訊(不推薦)
    ①刻畫段不推薦程式設計師主動繫結地址,因為一個埠執行被一個程序佔用,一旦要繫結的埠已經被使用,則會繫結失敗
    儘可能的避免了地址衝突的概率

在這裡插入圖片描述

5.介面介紹

  • ① 建立套接字:在核心中建立socket結構體
    int socket(int domain, int type, int protocol);

  • domain:地址域型別(地址有各種結構—ipv4,ipv6,local)–表示這是一個什麼樣通訊套接字 AF_INET—ipv4協議版本的地址域

  • type:套接字型別(SOCKET_STREAM流式套接字—預設協議是tcpSOCKET_DGRAM資料報套接字—預設是udp

  • protocol:協議型別—0表示要解字型別的預設協議;IPPROTO_TCP-6 / IPPROT_UDP-17

  • 返回值:返回套接字操作控制代碼—檔案描述符;失敗返回-1

  • ② 為套接字繫結地址資訊:在建立的socket結構體中描述源端的地址資訊,告訴作業系統那些資料放到自己的接收緩衝區
  • int bind(int sockfd, struct sockaddr*addr, socklen_t len)
  • sockfd:建立套接字返回的操作控制代碼
  • addr:要繫結的地址資訊----struct sockaddr 通用地址結構(通常不用這個)–
  • len:地址資訊長度
  • ipv4使用的是struct sockaddr_in{sin_family—地址域型別sin_port—網路位元組序埠sin_addr.s_addr–網路位元組序IP地址}
    在這裡插入圖片描述