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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LwIP tcp/ip socket编程listen函数分析

發(fā)布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LwIP tcp/ip socket编程listen函数分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

函數(shù)原型為:

[cpp]?view plain?copy
  • int?listen(int??sockfd,?int??backlog);?<span?style="font-family:?Arial,?Helvetica,?sans-serif;?background-color:?rgb(255,?255,?255);">//成功返回0,失敗返回-1</span>??


  • 下面只討論TCP ?UDP不做討論(很少使用到listen函數(shù))
    用法:函數(shù)應該在調用socket和bind這兩個函數(shù)之后,accept函數(shù)之前調用。
    作用:讓服務器套接字sockfd進于監(jiān)聽狀態(tài)。


    參數(shù):
    ? ? ? sockfd:套接字,成功返回后進入監(jiān)聽模式,當有新連接并accept后會再建立一個套接字保存新的連接
    ? ? ? backlog:暫且翻譯為后備連接吧!下面詳細介紹此參數(shù):
    1 ?當TCP接收一個連接后(三次握手通過)會將此連接存在連接請求隊列里面,并對隊列個數(shù)+1,而backlog為隊列的最大個數(shù),超過此值,則直接將新的連接刪除,即不在接收新的連接。將這些處于請求隊列里面的連接暫記為后備連接
    2 ?當應用層調用accept接收一個連接(處于請求隊列里面的后備連接),隊列個數(shù)會-1。
    3 ?很明顯backlog并不能限制連接的個數(shù),只能限制后備連接的個數(shù)。那為啥要用這個backlog呢?主要用于并發(fā)處理。
    4 ?backlog的取值范圍 ,一般為0-5,LwIP中在sockets.c中 對backlog進行了過濾:backlog = LWIP_MIN(LWIP_MAX(backlog,0), 0xff);即限制在0-0xff,但是在底層實現(xiàn)時tcp.c中有如下語句:lpcb->backlog = (backlog ? backlog : 1);即最小值為1,所以backlog在LwIP中的取值范圍為1-0xff。


    問題來了,既然backlog不能限制連接個數(shù),特別是處于后備的連接也會接受數(shù)據(jù),從而浪費資源,而且對方來連接服務器時顯示連接成功(通過三次握手),但是不能正常服務。那該如何限制呢?下面介紹3種方法:
    1 我只調用一次accept,讓其他連接處于后備連接,這樣就像上面說的那樣,會浪費資源,且讓連接端(客戶端)很迷茫;
    2 可以通過修改 宏MEMP_NUM_NETCONN的值,此值限定套接字最大個數(shù)(所有的)。這樣有個弊端,比如我有兩個服務器一個想要2個連接 ?而另一個想要3個連接,這樣就不行了。而且這時我有另一個tcp客戶端的應用,它也要占用一個socket,也會出現(xiàn)問題;
    3 ?我們可以關閉處于監(jiān)聽狀態(tài)的sock。假設我想限制3個連接,在應用層每當accept到一個連接時可以+1,當判斷有三個連接時關閉sock。然后動態(tài)的檢測當前的計數(shù)值,當小于3時,再打開此sock,當然這樣操作必須使能SO_REUSEPORT(允許重用本地地址),可以通過調用setsockopt函數(shù)來使能

    總結

    以上是生活随笔為你收集整理的LwIP tcp/ip socket编程listen函数分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。