linux的Listen調用詳解__linux

來源:互聯網
上載者:User

      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始終在系統中進行偵聽工作,所以在進程結束時,還必須顯式結束偵聽,進行相應的清理工作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.