【Linux】網路程式設計套接字socket
阿新 • • 發佈:2020-10-09
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接收緩衝區中取出資料
- 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—流式套接字—預設協議是tcp,SOCKET_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地址}