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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

listen函数

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

? ? ? ? ? listen函數,從英語上理解就是一個"聽"函數,實際上它也就是這個意思。我們來看unix網絡編程這本書是怎樣對它的解釋:listen函數把一個未連接的套接字轉換成一個被動套接字,指示內核應該接受指向該套接字的鏈接請求。該函數有2個參數,第一個我就不說了,第二參數規定了內核為相應套接字排隊的最大連接個數。只看這些理論搞的人稀里糊涂,我們還是來測一下。

?

[mapan@localhost test]$ ls client.cpp makefile server.cpp [mapan@localhost test]$ [mapan@localhost test]$ cat server.cpp #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #define MAXLINE 4096void main() {int listenfd,connfd;socklen_t clilen;struct sockaddr_in cliaddr,servaddr;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=INADDR_ANY;servaddr.sin_port=htons(8888);bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); listen(listenfd,1);getchar();connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);close(connfd);close(listenfd); } [mapan@localhost test]$ cat client.cpp #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #define MAXLINE 4096void main() {int sockfd;struct sockaddr_in servaddr;sockfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(8888);servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");int ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));getchar();close(sockfd); } [mapan@localhost test]$ cat makefile all:server clientserver.o:server.cppg++ -c server.cpp client.o:client.cppg++ -c client.cpp server:server.og++ -o server server.o client:client.og++ -o client client.oclean:rm -f server client *.o [mapan@localhost test]$

?

?

請注意上面的服務端中,我是沒有調用accept函數的,直接調用getchar()了,跑起來。

?

[mapan@localhost test]$ make g++ -c server.cpp g++ -o server server.o g++ -c client.cpp g++ -o client client.o [mapan@localhost test]$ ./server

服務度開啟,然后新打開一個窗口開啟客戶端。

[mapan@localhost TCP]$ cd ../test/ [mapan@localhost test]$ [mapan@localhost test]$ ./client 127.0.0.1

?

查看網絡:

[mapan@localhost test]$ netstat -na | grep 8888 tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:34846 127.0.0.1:8888 ESTABLISHED tcp 0 0 127.0.0.1:8888 127.0.0.1:34846 ESTABLISHED [mapan@localhost test]$

看,已經建立起一個連接了。但是我們沒有調用accept函數,連接還是建立起來了,這說說明accept函數和TCP三次握手沒啥關系,這也是一個知識盲點。好,在開啟一個新窗口運行客戶端,查看網絡狀態。(新開窗口運行客戶端同上,這里就不用代碼演示了)

?

?

[mapan@localhost test]$ netstat -na | grep 8888 tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:34846 127.0.0.1:8888 ESTABLISHED tcp 0 0 127.0.0.1:34848 127.0.0.1:8888 ESTABLISHED tcp 0 0 127.0.0.1:8888 127.0.0.1:34846 ESTABLISHED tcp 0 0 127.0.0.1:8888 127.0.0.1:34848 ESTABLISHED


看,又建立起一個連接。在運行一個客戶端,看網絡狀態。

?

[mapan@localhost test]$ netstat -na | grep 8888 tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:8888 127.0.0.1:34850 SYN_RECV tcp 0 0 127.0.0.1:34846 127.0.0.1:8888 ESTABLISHED tcp 0 0 127.0.0.1:34848 127.0.0.1:8888 ESTABLISHED tcp 0 0 127.0.0.1:8888 127.0.0.1:34846 ESTABLISHED tcp 0 0 127.0.0.1:8888 127.0.0.1:34848 ESTABLISHED tcp 0 0 127.0.0.1:34850 127.0.0.1:8888 ESTABLISHED


當第三個客戶端連接進來的時候,出現了一個SYN_RECV,這標明第三個客戶端沒有與服務端建立連接。我們listen函數設置的監聽隊列為1,那么監聽隊列塞了2個之后就沒有往里面塞了。這下大概懂了listen函數第二個參數的意義了吧,當參數為1的時候只能監聽2個套接字,這應該是從0開始數的。為什么是大概呢?其實unix網絡編程上是這樣說的:listen函數的第二個參數是ESTABLISHED和SYN_RECV之和,只是在監聽隊列沒有滿的情況下,SYN_RECV狀態不容易重現。這時候在服務度輸入一個字符會有啥效果呢?答案告訴你,就是那個SYN_RECV狀態變成ESTABLISHED了,這也是 accept函數的作用。accept函數會將已完成連接隊列中的對頭項返回給進程,所以SYN_RECV變成ESTABLISHED了。這個現象留給大家去實踐一下吧,只有自己實踐出來的東西才是自己的。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

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

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

主站蜘蛛池模板: www在线观看视频 | 男女视频在线观看 | 九九热在线免费观看 | 91丨国产丨捆绑调教 | 欧美精品二区三区四区免费看视频 | 激情中文字幕 | 亚洲高清无码久久 | 深夜国产福利 | 中文字幕人妻互换av久久 | 天堂√| 欧美天天性影院 | 视频在线看| 中文字幕一区2区3区 | 亚洲日本香蕉视频 | 国产精品福利导航 | 成人免费xxxxx在线观看 | 国产精品免费电影 | 久久精品无码av | 19韩国主播青草vip | 好吊视频一二三区 | 亚洲日本影院 | 丰满少妇乱子伦精品看片 | 奇米精品一区二区三区在线观看一 | 欧美成人精品欧美一级私黄 | 国产精品久久久久久久一区二区 | 成人精品一区二区三区在线 | 天天想夜夜操 | 亚洲欧美另类中文字幕 | 涩涩涩涩av | 免费网站在线观看黄色 | 婷婷伊人五月天 | 日韩三级小视频 | 午夜剧场免费看 | 美女福利在线视频 | 好吊日免费视频 | 成人黄色在线观看视频 | 国产乱子轮xxx农村 岛国久久久 | 国产乱淫av麻豆国产免费 | 天堂在线中文字幕 | 国产三级aaa | 久久精品国产精品亚洲 | 日本少妇aaa | 美女脱了内裤喂我喝尿视频 | 国产美女视频一区 | 久久伊人av| 波多野结衣福利视频 | 日韩视频一区在线观看 | 中日韩av在线 | 男操女视频在线观看 | 国产美女免费网站 | 疯狂做受xxxx国产 | 亚洲宅男天堂 | 欧美一级网址 | 射美女| 你懂的在线免费观看 | 99999av | 女女互慰揉小黄文 | 岳睡了我中文字幕日本 | 无码任你躁久久久久久老妇 | 老版水浒传83版免费播放 | 亚洲精华国产精华精华液网站 | 在线成人av| 久久99国产精品成人 | 欧美一区二区三区视频 | 四季av一区二区 | 少女逼逼| 色偷偷网站 | 高潮又黄又刺激 | 久久爱影视 | 男人在线网站 | 在线播放一区二区三区 | 国产高清精品在线观看 | 日韩免费视频一区二区 | 99视频国产精品免费观看a | 性色av一区二区 | 亚洲av片不卡无码久久 | 来吧亚洲综合网 | 女生的胸无遮挡 | 动漫美女舌吻 | 好看的av在线 | 91成人福利在线 | 成人综合社区 | 天天射天天爽 | 国偷自产av一区二区三区麻豆 | 好男人www日本 | 在线男人天堂 | 黄色仓库av | 日本无翼乌邪恶大全彩h | 理论片91 | 呦呦视频在线观看 | 亚洲作爱 | 日本精品久久久久久 | 色欲亚洲Av无码精品天堂 | 麻豆爱爱| 国产精品三级电影 | av免费观看不卡 | 岛国大片在线免费观看 | 国产精品老熟女视频一区二区 | 久久成人乱码欧美精品一区二区 |