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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

listen()函數僅在TCP服務器端調用,它做兩個事情:將套接字轉換到LISTEN狀態和設置套接上的最大連接隊列。listen()對應的內核實現為sys_listen(),下面開始對其實現作具體的分析。

一、sys_listen()函數

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

/*
?*?Perform a listen. Basically, we allow the protocol to do anything
?*?necessary for a listen, and if that works, we mark the socket as
?*?ready for listening.
?*/

SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{
?struct socket *sock;
?int err, fput_needed;
?int somaxconn;

?sock = sockfd_lookup_light(fd, &err, &fput_needed);
?if (sock) {
? /*
? * sysctl_somaxconn存儲的是服務器監聽時,允許每個套接字連接隊列長度
? ? ? ? ? ? ? ? * 的最大值,默認值是SOMAXCONN,即128,在sysctl_core_net_init()函數中初始化。
? ? ? ? ? ? ? ? * 在proc文件系統中可以通過修改/proc/sys/net/core/somaxconn文件來修改這個值。
? */
? somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
? /*
? * 如果指定的最大連接數超過系統限制,則使用系統當前允許的連接隊列
? * 中連接的最大數。
? */
? if ((unsigned)backlog > somaxconn)
? ?backlog = somaxconn;

? err = security_socket_listen(sock, backlog);
? if (!err)
? ? ? ? ? ? ? ? ? ? ? /*
? ? * 如果是TCP套接字,sock->ops指向的是inet_stream_ops,
? ? * sock->ops是在inet_create()函數中初始化,所以listen接口
? ? * 調用的是inet_listen()函數。
? ? */
? ?err = sock->ops->listen(sock, backlog);

? fput_light(sock->file, fput_needed);
?}
?return err;
}

sys_listen()的代碼流程圖如下所示:

?

?

?

?

?

sys_listen()的代碼流程和sys_bind()很像,都是先調用sockfd_lookup_light()獲取描述符對應的socket實例,然后通過調用sock->ops中的操作接口來完成真正的操作。接下來看這段代碼:

if ((unsigned)backlog > somaxconn)
? ?backlog = somaxconn;

這里可以看出,如果指定的最大連接隊列數超過系統限制,會使用系統中設置的最大連接隊列數。所以,如果想擴大套接字的連接隊列,只調整listen()的backlog參數是沒用的,還要修改系統的設置才行。

總結

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

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