網路程式設計socket之listen函式

2021-08-22 11:44:36 字數 1252 閱讀 6006

**

摘要:listen函式使用主動連線套介面變為被連線套介面,使得乙個程序可以接受其它程序的請求,從而成為乙個伺服器程序。在tcp伺服器程式設計中listen函式把程序變為乙個伺服器,並指定相應的套接字變為被動連線。

listen函式在一般在呼叫bind之後-呼叫accept之前呼叫,它的函式原型是:

#include

int listen(int sockfd, int backlog)

返回:0──成功, -1──失敗

引數sockfd

被listen函式作用的套接字,sockfd之前由socket函式返回。在被socket函式返回的套接字fd之時,它是乙個主動連線的套接字,也就是此時系統假設使用者會對這個套接字呼叫connect函式,期待它主動與其它程序連線,然後在伺服器程式設計中,使用者希望這個套接字可以接受外來的連線請求,也就是被動等待使用者來連線。由於系統預設時認為乙個套接字是主動連線的,所以需要通過某種方式來告訴系統,使用者程序通過系統呼叫listen來完成這件事。

引數backlog

這個引數涉及到一些網路的細節。在程序正理乙個乙個連線請求的時候,可能還存在其它的連線請求。因為tcp連線是乙個過程,所以可能存在一種半連線的狀態,有時由於同時嘗試連線的使用者過多,使得伺服器程序無法快速地完成連線請求。如果這個情況出現了,伺服器程序希望核心如何處理呢?核心會在自己的程序空間裡維護乙個佇列以跟蹤這些完成的連線但伺服器程序還沒有接手處理或正在進行的連線,這樣的乙個佇列核心不可能讓其任意大,所以必須有乙個大小的上限。這個backlog告訴核心使用這個數值作為上限。

毫無疑問,伺服器程序不能隨便指定乙個數值,核心有乙個許可的範圍。這個範圍是實現相關的。很難有某種統一,一般這個值會小30以內。

下面是來自於(的一段話:

tcp的伺服器端socket基本流程socket->bind->listen->accept->send/recv->closesocket,客戶端基本流程socket->[bind->]->connect->send/recv->closesocket,其中客戶端connect函式應該是和伺服器端的listen函式相互作用,而不是accept函式。在listen函式中的第二個引數backlog代表著等待處理的連線佇列(以下簡稱佇列)的長度,神馬意思?我也不太懂,但是通過**實踐,我可以簡單的說,每當有乙個客戶端connect了,listen的佇列中就加入乙個連線,每當伺服器端accept了,就從listen的佇列中取出乙個連線,轉成乙個專門用來傳輸資料的socket(accept函式的返回值),所以在伺服器端程式中有兩個socket,前者是用來接收客戶端連線的socket...

Python之socket網路程式設計

實現主機間或一台電腦上的程序間進行通訊 例項如下 服務端 匯入socket sys模組 import socket import sys 建立socket物件 serversocket socket.socket socket.af inet,socket.sock stream 獲取本地主機名 h...

Python之Socket網路程式設計

socket起源於unix,而unix linux基本哲學之一就是 一切皆檔案 對於檔案用 開啟 讀寫 關閉 模式來操作。socket就是該模式的乙個實現,socket即是一種特殊的檔案,一些socket函式就是對其進行的操作 讀 寫io 開啟 關閉 socket和file的區別 1 file模組是...

網路基礎之 網路基礎,socket程式設計

1 什麼是socket 網路基礎 socket 2 為何要學習socket程式設計 基於socket開發乙個c s或者b s結構的軟體 client 網路 server browser 網路 server 3 如何基於socket程式設計 網路 網路是什麼 底層的物理連線介質 網際網路通訊協議 os...