av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

窺探Socket監(jiān)聽(tīng)的秘密

本文轉(zhuǎn)載自微信公眾號(hào)「盼盼編程」,作者盼盼編程。轉(zhuǎn)載本文請(qǐng)聯(lián)系盼盼編程公眾號(hào)。

員工經(jīng)過(guò)長(zhǎng)期磨合與沉淀,具備了協(xié)作精神,得以通過(guò)團(tuán)隊(duì)的力量開(kāi)發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)公司堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡(jiǎn)單”。公司專注于為企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、電商網(wǎng)站開(kāi)發(fā),微信小程序開(kāi)發(fā),軟件按需策劃等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。

socket用listen函數(shù)監(jiān)聽(tīng),listen從英語(yǔ)上理解就是一個(gè)"聽(tīng)"函數(shù),實(shí)際上它也就是這個(gè)意思。

我們來(lái)看unix網(wǎng)絡(luò)編程這本書(shū)是怎樣對(duì)它的解釋:listen函數(shù)把一個(gè)未連接的套接字轉(zhuǎn)換成一個(gè)被動(dòng)套接字,指示內(nèi)核應(yīng)該接受指向該套接字的鏈接請(qǐng)求。

該函數(shù)有2個(gè)參數(shù),第一個(gè)我就不說(shuō)了,第二參數(shù)規(guī)定了內(nèi)核為相應(yīng)套接字排隊(duì)的最大連接個(gè)數(shù)。只看這些理論搞的人稀里糊涂,我們還是來(lái)測(cè)一下。

 
 
  1. [mapan@localhost test]$ ls 
  2. client.cpp  makefile  server.cpp 
  3. [mapan@localhost test]$  
  4. [mapan@localhost test]$ cat server.cpp  
  5. #include  
  6. #include  
  7. #include  
  8. #include  
  9. #include  
  10. #include  
  11. #include  
  12. #include  
  13. #include  
  14. #include  
  15. #include  
  16. #include  
  17. #include  
  18. #include  
  19. #include  
  20. #include  
  21. #include  
  22. #include  
  23. #include  
  24. #include  
  25. #define MAXLINE 4096 
  26.  
  27.  
  28.  
  29. void main() 
  30.    int listenfd,connfd; 
  31.    socklen_t  clilen; 
  32.    struct sockaddr_in cliaddr,servaddr; 
  33.  
  34.    listenfd=socket(AF_INET,SOCK_STREAM,0); 
  35.    bzero(&servaddr,sizeof(servaddr)); 
  36.  
  37.    servaddr.sin_family=AF_INET; 
  38.    servaddr.sin_addr.s_addr=INADDR_ANY; 
  39.    servaddr.sin_port=htons(8888); 
  40.  
  41.    bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));   
  42.    listen(listenfd,1); 
  43.  
  44.    getchar(); 
  45.    connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); 
  46.  
  47.  
  48.  
  49.    close(connfd); 
  50.    close(listenfd); 
  51. [mapan@localhost test]$ cat client.cpp  
  52. #include  
  53. #include  
  54. #include  
  55. #include  
  56. #include  
  57. #include  
  58. #include  
  59. #include  
  60. #include  
  61. #include  
  62. #include  
  63. #include  
  64. #include  
  65. #include  
  66. #include  
  67. #include  
  68. #include  
  69. #include  
  70. #include  
  71. #include  
  72. #define MAXLINE 4096 
  73.  
  74.  
  75. void main() 
  76.    int sockfd; 
  77.    struct sockaddr_in servaddr; 
  78.  
  79.  
  80.    sockfd=socket(AF_INET,SOCK_STREAM,0); 
  81.    bzero(&servaddr,sizeof(servaddr)); 
  82.    servaddr.sin_family=AF_INET; 
  83.    servaddr.sin_port=htons(8888); 
  84.    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
  85.  
  86.    int ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 
  87.    getchar(); 
  88.  
  89.    close(sockfd); 
  90. [mapan@localhost test]$ cat makefile  
  91. all:server client 
  92.  
  93. server.o:server.cpp 
  94.   g++ -c server.cpp 
  95. client.o:client.cpp 
  96.   g++ -c client.cpp 
  97. server:server.o 
  98.   g++ -o server server.o 
  99. client:client.o 
  100.   g++ -o client client.o 
  101.  
  102. clean: 
  103.   rm -f server client *.o 
  104. [mapan@localhost test]$ 

請(qǐng)注意上面的服務(wù)端中,我是沒(méi)有調(diào)用accept函數(shù)的,直接調(diào)用getchar()了,跑起來(lái)。

 
 
  1. [mapan@localhost test]$ make 
  2. g++ -c server.cpp 
  3. g++ -o server server.o 
  4. g++ -c client.cpp 
  5. g++ -o client client.o 
  6. [mapan@localhost test]$ ./server  
  7.  
  8. 服務(wù)度開(kāi)啟,然后新打開(kāi)一個(gè)窗口開(kāi)啟客戶端。 
  9. [mapan@localhost TCP]$ cd ../test/ 
  10. [mapan@localhost test]$  
  11. [mapan@localhost test]$ ./client 127.0.0.1 

查看網(wǎng)絡(luò):

 
 
  1. [mapan@localhost test]$ netstat -na | grep 8888 
  2. tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN       
  3. tcp        0      0 127.0.0.1:34846             127.0.0.1:8888              ESTABLISHED  
  4. tcp        0      0 127.0.0.1:8888              127.0.0.1:34846             ESTABLISHED  
  5. [mapan@localhost test]$ 

看,已經(jīng)建立起一個(gè)連接了。但是我們沒(méi)有調(diào)用accept函數(shù),連接還是建立起來(lái)了,這說(shuō)說(shuō)明accept函數(shù)和TCP三次握手沒(méi)啥關(guān)系,這也是一個(gè)知識(shí)盲點(diǎn)。好,在開(kāi)啟一個(gè)新窗口運(yùn)行客戶端,查看網(wǎng)絡(luò)狀態(tài)。(新開(kāi)窗口運(yùn)行客戶端同上,這里就不用代碼演示了)

 
 
  1. [mapan@localhost test]$ netstat -na | grep 8888 
  2. tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN       
  3. tcp        0      0 127.0.0.1:34846             127.0.0.1:8888              ESTABLISHED  
  4. tcp        0      0 127.0.0.1:34848             127.0.0.1:8888              ESTABLISHED  
  5. tcp        0      0 127.0.0.1:8888              127.0.0.1:34846             ESTABLISHED  
  6. tcp        0      0 127.0.0.1:8888              127.0.0.1:34848             ESTABLISHED 

看,又建立起一個(gè)連接。在運(yùn)行一個(gè)客戶端,看網(wǎng)絡(luò)狀態(tài)。

 
 
  1. [mapan@localhost test]$ netstat -na | grep 8888 
  2. tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN       
  3. tcp        0      0 127.0.0.1:8888              127.0.0.1:34850             SYN_RECV     
  4. tcp        0      0 127.0.0.1:34846             127.0.0.1:8888              ESTABLISHED  
  5. tcp        0      0 127.0.0.1:34848             127.0.0.1:8888              ESTABLISHED  
  6. tcp        0      0 127.0.0.1:8888              127.0.0.1:34846             ESTABLISHED  
  7. tcp        0      0 127.0.0.1:8888              127.0.0.1:34848             ESTABLISHED  
  8. tcp        0      0 127.0.0.1:34850             127.0.0.1:8888              ESTABLISHED 

當(dāng)?shù)谌齻€(gè)客戶端連接進(jìn)來(lái)的時(shí)候,出現(xiàn)了一個(gè)SYN_RECV,這標(biāo)明第三個(gè)客戶端沒(méi)有與服務(wù)端建立連接。

我們listen函數(shù)設(shè)置的監(jiān)聽(tīng)隊(duì)列為1,那么監(jiān)聽(tīng)隊(duì)列塞了2個(gè)之后就沒(méi)有往里面塞了。這下大概懂了listen函數(shù)第二個(gè)參數(shù)的意義了吧,當(dāng)參數(shù)為1的時(shí)候只能監(jiān)聽(tīng)2個(gè)套接字,這應(yīng)該是從0開(kāi)始數(shù)的。

為什么是大概呢?其實(shí)unix網(wǎng)絡(luò)編程上是這樣說(shuō)的:listen函數(shù)的第二個(gè)參數(shù)是ESTABLISHED和SYN_RECV之和,只是在監(jiān)聽(tīng)隊(duì)列沒(méi)有滿的情況下,SYN_RECV狀態(tài)不容易重現(xiàn)。這時(shí)候在服務(wù)度輸入一個(gè)字符會(huì)有啥效果呢?

答案告訴你,就是那個(gè)SYN_RECV狀態(tài)變成ESTABLISHED了,這也是 accept函數(shù)的作用。accept函數(shù)會(huì)將已完成連接隊(duì)列中的對(duì)頭項(xiàng)返回給進(jìn)程,所以SYN_RECV變成ESTABLISHED了。這個(gè)現(xiàn)象留給大家去實(shí)踐一下吧,只有自己實(shí)踐出來(lái)的東西才是自己的。


文章題目:窺探Socket監(jiān)聽(tīng)的秘密
當(dāng)前URL:http://uogjgqi.cn/article/djhcgji.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流