監聽socket與已連接socket


TCP協議的Socket程序函數調用過程

img

服務端

  • socket():創建socket描述符(socket descriptor),可以通過它來進行一些讀寫操作。這個socket是主動socket(active socket)
  • bind():
    • IP:綁定IP到socket。根據監聽的網卡,可以是一個IP,也可以是多個IP
    • PORT:綁定端口到socket
  • listen():將此socket轉變為監聽socket : {*,*,本機 IP,本機端口 },並監聽客戶端通過connect()發出連接請求,進行三次握手建立連接
  • accept():
    • 默認會阻塞進程,拿出一個已經完成的連接進行處理。如果還沒有完成,就要繼續阻塞
    • 完成處理之后返回一個已連接socket:{ 對端 IP,對端端口,本機 IP,本機端口 }
    • 已連接socket並沒有占用新的端口與客戶端通信,依然使用的是與監聽socket一樣的端口號
  • read()/white():accept完成之后,就可以進行網絡I/O操作,即類同於普通文件的讀寫I/O操作

為什么會有了監聽socket還需要建立已連接socket

  • 如果只使用監聽socket來處理,那么監聽socket在阻塞監聽客戶端連接請求時,同時需要建立{ 本機 IP,本機端口 } : {對端 IP,對端端口},1對多的數據結構,且還需要接受read()/write()處理。聚合多個復雜邏輯的處理與計算機發展邏輯沖突,分層分治才是更優的解決辦法
  • 確保職責分工,分層協作,提高服務端性能
    • 監聽socket只接受accept()處理
    • 已連接socket只接受read()/write()處理

參考

套接字Socket

監聽 socket、已連接 socket

一文讓你透徹理解Linux的SOCKET編程(含實例解析)

為什么有監聽socket和連接socket,為什么產生兩個socket

監聽套接字與已連接套接字

socket的accept函數解析以及服務器和多個客戶端的端口問題

accept()返回的套接字綁定哪個端口 新舊套接字的聯系

socket INADDR_ANY 監聽0.0.0.0地址 socket只綁定端口讓路由表決定傳到哪個ip

多網卡 socket 的bind問題

unix網絡編程——ioctl 函數的用法詳解

嵌入式Linux下雙網口Socket編程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM