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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

listen()函数中backlog参数分析

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 listen()函数中backlog参数分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景知識

Unix網絡編程描述如下:



總結

0. accept()函數不參與三次握手,而只負責從已建立連接隊列中取出一個連接和sockfd進行綁定;
1. backlog參數決定了未完成隊列和已完成隊列中連接數目之和的最大值(從內核角度看,是否這個和就是等于sock->recv_queue ?);
2. accept()函數調用,會從已連接隊列中取出一個“連接”(可以是一個描述連接的數據結構,listensocket->sock->recv_queue[sk_buff] ? ),未完成隊列和已完成隊列中連接數目 ? ? ?之和將減少1;即accept將監聽套接字對應的sock的接收隊列中的已建立連接的sk_buff取下(從該sk_buff中可以獲得對端主機的發送過來的tcp/ip數據包)
3. 監聽套接字的已完成隊列中的元素個數大于0,那么該套接字是可讀的。
4. 當程序調用accept的時候(設置阻塞參數),那么判定該套接字是否可讀,不可讀則進入睡眠,直至已完成隊列中的元素個數大于0(監聽套接字可讀)而喚起監聽進程。


實例分析1

將服務器端的listen函數backlog設置為2,用20個客戶端與服務器建立連接,查看連接的建立情況。

服務器代碼:

[cpp] view plain copy
  • #include?<stdio.h>??
  • #include<unistd.h>??
  • #include<sys/types.h>???????/*?basic?system?data?types?*/??
  • #include<sys/socket.h>??????/*?basic?socket?definitions?*/??
  • #include<netinet/in.h>??????/*?sockaddr_in{}?and?other?Internet?defns?*/??
  • #include<arpa/inet.h>???????/*?inet(3)?functions?*/??
  • #include<sys/epoll.h>???????/*?epoll?function?*/??
  • #include<fcntl.h>??
  • #include<stdlib.h>??
  • #include<errno.h>??
  • #include<stdio.h>??
  • #include<string.h>??
  • ??
  • ??
  • int?main(int?argc,char*argv[])??
  • {??
  • ????int?listenfd,connfd;??
  • ????struct?sockaddr_in?cliaddr,servaddr;??
  • ????int?queuelen=5;??
  • ??
  • ????if(argc!=2){??
  • ????????puts("usage#?./aworker?listenqueuelen");??
  • ????????exit(0);??
  • ????}?????
  • ????queuelen=atoi(argv[1]);??
  • ??
  • ????listenfd?=?socket(AF_INET,SOCK_STREAM,0);??
  • ??
  • ????bzero(&servaddr,sizeof(servaddr));??
  • ????servaddr.sin_family?=?AF_INET;??
  • ????servaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);??
  • ????servaddr.sin_port?=?htons(2989);??
  • ??????
  • ????bind(listenfd,(struct?sockaddr*)&servaddr,sizeof(servaddr));??
  • ??????
  • ????listen(listenfd,queuelen);??
  • ????sleep(60);?//將這個注釋,會出現另一種情況喲~~????
  • ????while(1)??
  • ????{??
  • ????????connfd?=?accept(listenfd,NULL,0);??
  • ????????if(connfd?==?-1)??
  • ????????{??
  • ????????????perror("accept?error");??
  • ????????????continue;??
  • ????????}??
  • ????????puts("new?connection...");??
  • ????}??
  • ????return?0;??
  • }??

  • client代碼 [cpp] view plain copy
  • #include?"client.h"??
  • ??
  • //void?cli_hander(int?sockfd,)??
  • ??
  • int?main()??
  • {??
  • ????int?sockfd;??
  • ????int?rc;???
  • ????int?cpid;??
  • ????struct?sockaddr_in?servaddr;??
  • ??????
  • ????bzero(&servaddr,sizeof(servaddr));??
  • ????servaddr.sin_family?=?AF_INET;??
  • ????inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);??
  • ????servaddr.sin_port?=?htons(2989);??
  • ??????
  • ????for(int?i=0;i<20;i++)??
  • ????{?????
  • ????????cpid?=?fork();??
  • ????????if(cpid?==?0)??
  • ????????{?????
  • ????????????sockfd?=?socket(AF_INET,SOCK_STREAM,0);??
  • ????????????rc?=?connect(sockfd,(struct?sockaddr*)&servaddr,sizeof(servaddr));??
  • ????????????if(rc?==?-1)???
  • ????????????{?????
  • ????????????????perror("connect?error");??
  • ????????????????exit(0);??
  • ????????????}?????
  • ????????????printf("pid#%d?connected...\n",getpid());??
  • ????????????sleep(3);??
  • ????????????close(sockfd);??
  • ????????????exit(0);??
  • ????????}?????
  • ????}?????
  • ??
  • ????while(1)??
  • ????{?????
  • ????????cpid?=?wait(NULL);??
  • ????????if(cpid==-1){??
  • ????????????perror("end?of?wait");??
  • ????????????break;??
  • ????????}??
  • ????????printf("pid#%d?exit...\n",cpid);??
  • ????}??
  • ????return?0;??
  • }??

  • 實驗結果:

    服務器端顯示:

    [cpp] view plain copy
  • root@cloud2:~/slp/NetWrokProgram/server#?./aworker?2??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??

  • 客戶端顯示: [cpp] view plain copy
  • root@cloud2:~/slp/NetWrokProgram/client#?./a.out???
  • pid#16697?connected...??
  • pid#16699?connected...??
  • pid#16698?connected...??
  • pid#16697?exit...??
  • pid#16699?exit...??
  • pid#16698?exit...??
  • pid#16700?connected...??
  • pid#16701?connected...??
  • pid#16700?exit...??
  • pid#16701?exit...??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • connect?error:?Connection?timed?out??
  • pid#16702?exit...??
  • pid#16703?exit...??
  • pid#16704?exit...??
  • pid#16705?exit...??
  • pid#16706?exit...??
  • pid#16707?exit...??
  • pid#16708?exit...??
  • pid#16709?exit...??
  • pid#16710?exit...??
  • pid#16711?exit...??
  • pid#16712?exit...??
  • pid#16713?exit...??
  • pid#16714?exit...??
  • pid#16715?exit...??
  • pid#16716?exit...??
  • end?of?wait:?No?child?processes??

  • 結果分析:

    同時建立連接的客戶端進程共有20個,可是只有5個完成了連接的建立,其他15個沒有成功。有趣的是,建立的5個鏈接中有3個是馬上建立的,2個是過了一段時間后后來才建立的。

    實例分析2

    將server端的代碼中的sleep(60)注釋,即服務端listen即開始進入while循環中的accept阻塞:
    [html] view plain copy
  • ...??
  • listen(listenfd,queuelen);??
  • sleep(60);?//將這個注釋,會出現另一種情況喲~~????
  • while(1)??
  • {??
  • ????connfd?=?accept(listenfd,NULL,0);??
  • ????....??

  • 同樣的運行,結果如下:
    [html] view plain copy
  • root@cloud2:~/slp/NetWrokProgram/server#?./aworker?2??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??
  • new?connection...??

  • 客戶端: [html] view plain copy
  • root@cloud2:~/slp/NetWrokProgram/client#?./a.out???
  • pid#16736?connected...??
  • pid#16737?connected...??
  • pid#16738?connected...??
  • pid#16739?connected...??
  • pid#16740?connected...??
  • pid#16741?connected...??
  • pid#16742?connected...??
  • pid#16743?connected...??
  • pid#16744?connected...??
  • pid#16745?connected...??
  • pid#16746?connected...??
  • pid#16747?connected...??
  • pid#16748?connected...??
  • pid#16749?connected...??
  • pid#16750?connected...??
  • pid#16751?connected...??
  • pid#16752?connected...??
  • pid#16753?connected...??
  • pid#16755?connected...??
  • pid#16754?connected...??
  • pid#16736?exit...??
  • pid#16737?exit...??
  • pid#16738?exit...??
  • pid#16739?exit...??
  • pid#16740?exit...??
  • pid#16741?exit...??
  • pid#16742?exit...??
  • pid#16743?exit...??
  • pid#16744?exit...??
  • pid#16745?exit...??
  • pid#16746?exit...??
  • pid#16747?exit...??
  • pid#16748?exit...??
  • pid#16749?exit...??
  • pid#16750?exit...??
  • pid#16751?exit...??
  • pid#16752?exit...??
  • pid#16753?exit...??
  • pid#16755?exit...??
  • pid#16754?exit...??
  • end?of?wait:?No?child?processes??

  • 結果分析: 由于每個連接在建立之后,已完成隊列中的連接馬上就被accept給讀取了,所以已完成和未完成隊列中的連接數之和根本不可能超過backlog限定的個數。
    原文鏈接: http://blog.csdn.net/ordeder/article/details/21551567

    總結

    以上是生活随笔為你收集整理的listen()函数中backlog参数分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 91免费网站 | 国产视频aaa | 日韩影院在线 | av网站地址 | 国产精品麻豆欧美日韩ww | 日韩成人午夜影院 | 瑟瑟视频在线 | 日韩精品中字 | 久久噜噜噜精品国产亚洲综合 | 韩国无码一区二区三区精品 | 麻豆成人网 | 荷兰av| www国产在线| 日本不卡一区 | 男女一进一出视频 | 日韩一区二区三区四区在线 | 日韩在线www | 主播福利在线 | 天天综合网在线观看 | 久久亚洲精品无码va白人极品 | 久久久久高潮 | 欧美一级色图 | 亚洲国产精品久久 | 黑人乱码一区二区三区av | 亚洲第一狼人区 | 国产精品久久久久久久久久久久久久久久久久 | 免费看av在线 | 亚洲 激情 小说 另类 欧美 | 成人免费av在线 | 国产人成一区二区三区影院 | 久久久夜色精品亚洲 | 久久这里 | 日本精品视频网站 | 国产美女视频一区二区 | 国产精品精品 | 麻豆视频在线观看免费网站 | 欧美日韩视频在线观看一区 | 天天操夜夜添 | 国产欧美一区二区三区精品酒店 | 午夜影院免费版 | 欧美性大战久久久久久久 | av色网站 | 黑人巨大猛烈捣出白浆 | 国产精品国产精品国产专区蜜臀ah | 日韩成人一级 | 国产一级黄色录像 | 精品人妻一区二区三区蜜桃视频 | 国产午夜久久 | 欧美人与性禽动交精品 | 亚洲乱码国产乱码精品精软件 | 床上激情网站 | 小俊大肉大捧一进一出好爽 | 色av吧 | 欧美精品第1页 | 午夜久久网| 日韩av在线一区二区 | 精品一区二区三区免费毛片 | 亚洲精品www久久久久久广东 | 成人av一级 | 国产精品sm调教免费专区 | 国产精品视频播放 | 中文在线√天堂 | 色撸撸在线视频 | 亚洲AV无码久久精品国产一区 | 久久首页| 亚洲欧洲日本在线 | 欧美性生交大片免费看app麻豆 | www四虎影院 | 91精品网 | 美女视频国产 | 精品人妻av在线 | 夜噜噜 | 好av在线 | 日韩av电影网站 | 私密spa按摩按到高潮 | 国产精品久久免费视频 | 狠狠97| 黄色视屏在线免费观看 | av操操| v片在线免费观看 | 成人免费三级 | 国产女人精品视频 | 国产亚洲精品久久久久久打不开 | 精品视频在线看 | 国产偷人爽久久久久久老妇app | 99视频在线观看视频 | 国产成人手机在线 | 亚洲一区二区三区高清视频 | 成人午夜看片 | 欧洲影院 | 日本在线高清视频 | 亚洲一区二区自拍 | 国产精品成人va在线观看 | 性色av一区二区三区在线观看 | 超碰97av在线 | 色哟哟视频在线观看 | 国产日产久久高清欧美一区 | 少妇高潮淫片免费观看 | 成人听书哪个软件好 |