日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

sys接口linux编程,网络编程常用接口的内核实现----sys_listen()

發布時間:2024/8/1 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sys接口linux编程,网络编程常用接口的内核实现----sys_listen() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

四、reqsk_queue_alloc()函數

reqsk_queue_alloc()的源碼實現及分析如下所示:

/*

* 用來分配連接請求塊散列表,然后將其連接到所在傳輸控制塊的請求

* 塊容器中。

*/

int reqsk_queue_alloc(struct request_sock_queue *queue,

unsigned int nr_table_entries)

{

size_t lopt_size = sizeof(struct listen_sock);

struct listen_sock *lopt;

/*

* 取用戶設定的連接隊列長度最大值參數nr_table_entries和系統最多

* 可同時存在未完成三次握手SYN請求數sysctl_max_syn_backlog兩者的

* 最小值,他們都用來控制連接隊列的長度,只是前者針對某傳輸控制

* 塊,而后者控制的是全局的

*/

nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog);

nr_table_entries = max_t(u32, nr_table_entries, 8);

/*

* 調用roundup_pow_of_two以確保nr_table_entries的值為2的n次方

*/

nr_table_entries = roundup_pow_of_two(nr_table_entries + 1);

/*

* 計算用來保存SYN請求連接的listen_sock結構的大小

*/

lopt_size += nr_table_entries * sizeof(struct request_sock *);

if (lopt_size > PAGE_SIZE)

/*

* 如果用于保存SYN請求連接的listen_sock結構大于一個頁面,

* 則調用__vmalloc()從高位內存中分配虛擬內存,并且清零

*/

lopt = __vmalloc(lopt_size,

GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO,

PAGE_KERNEL);

else

/*

* 如果小于一個頁面,則在常規內存中分配內存并清零。kzalloc()

* 封裝了kmalloc()及memset()

*/

lopt = kzalloc(lopt_size, GFP_KERNEL);

if (lopt == NULL)

return -ENOMEM;

/*

* 從nr_table_entries = max_t(u32, nr_table_entries, 8);中可以看出

* nr_table_entries最小值為8,所以這里從3開始

*/

for (lopt->max_qlen_log = 3;

(1 << lopt->max_qlen_log) < nr_table_entries;

lopt->max_qlen_log++);

/*

* 初始化listen_sock結構中的一些成員,如用于生成連接請求塊

* 散列表的hash_rnd等

*/

get_random_bytes(&lopt->hash_rnd, sizeof(lopt->hash_rnd));

rwlock_init(&queue->syn_wait_lock);

queue->rskq_accept_head = NULL;

lopt->nr_table_entries = nr_table_entries;

/*

* 將散列表連接到所在傳輸控制塊的請求塊容器中

*/

write_lock_bh(&queue->syn_wait_lock);

queue->listen_opt = lopt;

write_unlock_bh(&queue->syn_wait_lock);

return 0;

}

從上面的代碼中可以看到半連接隊列長度的計算過程,nr_table_entries的值存儲的就是計算的結果,這個值是基于listen()的第二個參數的值計算得到的。半連接隊列的上限值的以2為底的對數存儲在lopt的max_qlen_log成員中,對數的計算是通過下面的代碼完成的,如下所示:

for (lopt->max_qlen_log = 3;

(1 << lopt->max_qlen_log) < nr_table_entries;

lopt->max_qlen_log++);

五、結束語

在listen()系統調用中,第二個參數backlog對服務器的程序影響是很大的,而且不同的系統對這個參數的使用可能有所不同。前面我們也提到了,《Unix網絡編程》中對第二參數backlog的描述是連接隊列和半連接隊列的長度之和不超過backlog,但是在Linux中并不是這樣,限于篇幅,后面會單獨寫一篇關于backlog參數的分析文章來詳細介紹。 見 http://www.linuxidc.com/Linux/2013-02/79859.htm

總結

以上是生活随笔為你收集整理的sys接口linux编程,网络编程常用接口的内核实现----sys_listen()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。