tcp listen呼叫和accept呼叫

2021-06-06 12:21:14 字數 1826 閱讀 8764

在看listen的**之前.我們也先來看相關的資料結構:

inet_connection_sock它包含了乙個icsk_accept_queue的域,這個域是乙個request_sock_queue型別,.我們就先來看這個結構:

request_sock_queue也就表示乙個request_sock佇列.這裡我們知道,tcp中分為半連線佇列(處於syn_recvd狀態)和已完成連線佇列(處於established狀態).這兩個乙個是剛接到syn,等待三次握手完成,乙個是已經完成三次握手,等待accept來讀取.

這裡每個syn分節到來都會新建乙個request_sock結構,並將它加入到listen_sock的request_sock hash表中.然後3次握手完畢後,將它放入到request_sock_queue的rskq_accept_head和rskq_accept_tail佇列中.這樣當accept的時候就直接從這個佇列中讀取了.

struct request_sock_queue ;  

struct listen_sock ;  

request_sock的結構就不在這裡貼出來了,我們只要知道每乙個syn請求都會新建乙個request_sock結構,並將它加入到listen_sock的syn_table雜湊表中,然後接收端會傳送乙個syn/ack段給syn請求端,當syn請求端將3次握手的最後乙個ack傳送給接收端後,並且接收端判斷ack正確,則將request_sock從syn_table雜湊表中刪除,將request_sock加入到request_sock_queue的rskq_accept_head和rskq_accept_tail佇列中,最後的accept系統呼叫不過是判斷accept佇列是否存在完成3次請求的request_sock,

從這個佇列中將request_sock結構釋放,然後在bsd層新建乙個socket結構,並將它和接收端新建的子sock結構關聯起來。

我們可以想到,listen系統呼叫必然要分配乙個

listen_sock結構,其實也正如此,inet_listen系統呼叫最終會呼叫‍inet_csk_listen_start函式,

它的主要工作是新分配乙個listen socket,將它加入到inet_connection_sock的icsk_accept_queue域的listen_opt中.然後對當前使用埠進行判斷.最終返回,

int

inet_csk_listen_start(struct sock *sk,

const

int

nr_table_entries)   

///不可用,則返回錯誤.

sk->sk_state = tcp_close;   

__reqsk_queue_destroy(&icsk->icsk_accept_queue);   

return

-eaddrinuse;   

}  inet_accept系統呼叫最終會呼叫inet_csk_accept,‍inet_csk_accept呼叫reqsk_queue_get_child從accept佇列中取乙個request_sock,得到request_sock對應的sock,然後將request_scok刪除,這裡的目的主要是為了得到request_soc的對應的sock,還在bsd層生成相應的sock結構,‍reqsk_queue_get_child**如下(2.6.32核心):

static inline struct sock *reqsk_queue_get_child(struct request_sock_queue *queue,

struct sock *parent)

傳值呼叫和引用呼叫

值呼叫是指當發生函式呼叫時候,給形參分配記憶體空間,並用實參來初始化形參 直接將實參的值傳遞給形參 這一過程是引數值的單向傳遞過程,一旦形參獲得了值,便於實參脫離了關係,此後無論形參發生了什麼變化,都不影響實參了.引用呼叫將引用作為形參,在執行主調函式中的呼叫語句時候,系統自動用實參來初始化形參.這...

顯示呼叫和隱式呼叫

使用類名呼叫時顯式呼叫。c 中,顯式介面只能使用介面呼叫,隱式介面使用類和介面呼叫皆可。c 首先動態庫分為顯示呼叫和隱式呼叫,這個的區別呢,顯示呼叫 需要loadlibray和freelibrary,隱式呼叫不需要loadlibrary和freelibrary,只是需要匯入相關的lib檔案,因此,如...

引用呼叫和傳值呼叫

1.傳值呼叫又分為資料傳值呼叫和位址傳值呼叫。資料傳值呼叫方式是將實參的資料值傳遞給形參。實參和形參在棧空間內的位址不相同,改變形參值不影響實參值 位址傳值呼叫方式是將實參的位址值傳遞給形參,實參和形參在棧空間內共用同一位址,改變形參值就可改變實參值。2.引用呼叫是將實參變數值傳遞給形參,而形參是實...