linux的Listen呼叫詳解

2021-05-22 23:34:19 字數 1884 閱讀 9701

listen系統可以使一台主機上的乙個tcp socket在某個埠號被動偵聽,等待來自其它主機的tcp socket的連線請求,下面是listen系統呼叫的函式原型:

#include int listen(int s, int backlog);

1)backlog是偵聽佇列的長度,在核心函式中,首先對backlog作檢查,如果大於128,則強制使其等於128。

2)接下來要檢查結構體struct sock的成員sk_state,即當前socket的狀態,如果不為tcp_listen,則開始啟動埠偵聽。

啟動埠偵聽首先要為結構體struct inet_connection_sock(它是struc sock的擴充套件,表示乙個面向連線的socket)的成員icsk_accept_queue分配記憶體,icsk_accept_queue的型別是struct request_sock_queue,

定義如下:

struct request_sock_queue

struct request_sock *rskq_accept_head;

struct request_sock *rskq_accept_tail;

rwlock_t syn_wait_lock;

u8 rskq_defer_accept;

struct listen_sock *listen_opt;

tcp socket在偵聽的時候,那些來自其它主機的tcp socket的連線請求一旦被接受(完成三次握手協議),便會建立乙個request_sock,建立與請求socket之間的乙個tcp連線。該request_sock會被放在乙個先進先出的佇列中,等待accept系統呼叫的處理。但上面的結構體中好像並沒有可以存放request_sock的地方,

下面是結構體struct listen_sock的定義:

struct listen_sock

u8 max_qlen_log;

int qlen;

int qlen_young;

int clock_hand;

u32 hash_rnd;

u32 nr_table_entries;

struct request_sock *syn_table[0];

新建立的request_sock就存放在syn_table中。這是乙個雜湊陣列,總共有nr_table_entries項。實際上在分配記憶體時,分配的大小是tcp_synq_hsize(512)項。成員nr_table_entries的值是512。成員max_qlen_log以2的對數的形式表示request_sock佇列的最大值。雜湊表有512項,但佇列的最大值的取值是1024。即max_qlen_log的值為10。qlen是佇列的當前長度。hash_rnd是乙個隨機數,計算雜湊值用,結構體struct request_sock_queue中的rskq_accept_head和rskq_accept_tail分別指向request_sock佇列的佇列頭和佇列尾。 為struct inet_connection_sock分配完記憶體後,繼續處理,結構體struct sock有兩個成員sk_ack_backlog和sk_max_ack_backlog。sk_ack_backlog表示該偵聽socket上,當前連向該socket,但是還沒有完成三次握手協議的socket的數量,即還在連線過程中的socket的數量。初始值為0,sk_max_ack_backlog為該數量的最大值,也就是listen系統呼叫的第二個引數,即偵聽佇列的長度,它的真正含義是:偵聽socket能處理的最大併發連線請求數,其最大取值為128。

到這裡,把socket的狀態改為tcp_listen,進入偵聽狀態。然後獨佔埠,使socket進入mytcp_hashinfo雜湊表集中的listening_hash表。偵聽建立完成。 由於偵聽socket始終在系統中進行偵聽工作,所以在程序結束時,還必須顯式結束偵聽,進行相應的清理工作。

ImageMagick的linux安裝詳解

imagemagick的linux安裝詳解 系統版本 rhel 4u4 freetype 2.1.9 1.i386.rpm 吧這個包裝上。我的系統安裝文件上預設就少這個包 在cd2裡 開啟控制台,切換到剛剛解壓出來的imagemagick的目錄。執行下列命令 1 configure enable s...

Linux中的parse cmdline詳解

注 核心版本linux 2.6.30 parse cmdline的主要作用是用來解析命令列引數。其實現原理 乙個無窮迴圈,首先來查詢第乙個空格,如果找到,來空格之前的字串是否與early param相匹配,如果是,則通過實現的功能函式來找出其體引數。如果找到字串的末尾或cmdline的長度大於預設長...

TCP的listen和accept函式

int listen int sockfd,int backlog 完成兩件事情 1 將未連線的套介面轉換成被動套介面,指示核心應接收指向此套 接的連線請求。導致套介面從closed狀態到listen狀態 2 規定核心為此套介面排隊的最大連線數。一般來講,此函式應該在呼叫了socket bind之後...