成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

窺探 Socket 監聽的秘密

安全 數據安全
我們來看unix網絡編程這本書是怎樣對它的解釋:listen函數把一個未連接的套接字轉換成一個被動套接字,指示內核應該接受指向該套接字的鏈接請求。

 [[416995]]

本文轉載自微信公眾號「盼盼編程」,作者盼盼編程。轉載本文請聯系盼盼編程公眾號。

socket用listen函數監聽,listen從英語上理解就是一個"聽"函數,實際上它也就是這個意思。

我們來看unix網絡編程這本書是怎樣對它的解釋:listen函數把一個未連接的套接字轉換成一個被動套接字,指示內核應該接受指向該套接字的鏈接請求。

該函數有2個參數,第一個我就不說了,第二參數規定了內核為相應套接字排隊的最大連接個數。只看這些理論搞的人稀里糊涂,我們還是來測一下。

  1. [mapan@localhost test]$ ls 
  2. client.cpp  makefile  server.cpp 
  3. [mapan@localhost test]$  
  4. [mapan@localhost test]$ cat server.cpp  
  5. #include <unistd.h> 
  6. #include <sys/types.h> 
  7. #include <sys/socket.h> 
  8. #include <netdb.h> 
  9. #include <stdio.h> 
  10. #include <stdlib.h> 
  11. #include <string.h> 
  12. #include <ctype.h> 
  13. #include <errno.h> 
  14. #include <malloc.h> 
  15. #include <netinet/in.h> 
  16. #include <arpa/inet.h> 
  17. #include <sys/ioctl.h> 
  18. #include <stdarg.h> 
  19. #include <fcntl.h> 
  20. #include <sys/types.h> 
  21. #include <sys/wait.h> 
  22. #include <netinet/in.h> 
  23. #include <arpa/inet.h> 
  24. #include <signal.h> 
  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 <unistd.h> 
  53. #include <sys/types.h> 
  54. #include <sys/socket.h> 
  55. #include <netdb.h> 
  56. #include <stdio.h> 
  57. #include <stdlib.h> 
  58. #include <string.h> 
  59. #include <ctype.h> 
  60. #include <errno.h> 
  61. #include <malloc.h> 
  62. #include <netinet/in.h> 
  63. #include <arpa/inet.h> 
  64. #include <sys/ioctl.h> 
  65. #include <stdarg.h> 
  66. #include <fcntl.h> 
  67. #include <sys/types.h> 
  68. #include <sys/wait.h> 
  69. #include <netinet/in.h> 
  70. #include <arpa/inet.h> 
  71. #include <signal.h> 
  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]$ 

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

  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. 服務度開啟,然后新打開一個窗口開啟客戶端。 
  9. [mapan@localhost TCP]$ cd ../test/ 
  10. [mapan@localhost test]$  
  11. [mapan@localhost test]$ ./client 127.0.0.1 

查看網絡:

  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]$ 

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

  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 

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

  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 

當第三個客戶端連接進來的時候,出現了一個SYN_RECV,這標明第三個客戶端沒有與服務端建立連接。

我們listen函數設置的監聽隊列為1,那么監聽隊列塞了2個之后就沒有往里面塞了。這下大概懂了listen函數第二個參數的意義了吧,當參數為1的時候只能監聽2個套接字,這應該是從0開始數的。

為什么是大概呢?其實unix網絡編程上是這樣說的:listen函數的第二個參數是ESTABLISHED和SYN_RECV之和,只是在監聽隊列沒有滿的情況下,SYN_RECV狀態不容易重現。這時候在服務度輸入一個字符會有啥效果呢?

答案告訴你,就是那個SYN_RECV狀態變成ESTABLISHED了,這也是 accept函數的作用。accept函數會將已完成連接隊列中的對頭項返回給進程,所以SYN_RECV變成ESTABLISHED了。這個現象留給大家去實踐一下吧,只有自己實踐出來的東西才是自己的。

 

責任編輯:武曉燕 來源: 盼盼編程
相關推薦

2020-09-07 19:40:06

監聽Facebook手機

2009-06-23 14:08:00

Java Socket

2013-01-08 09:37:26

大數據數據采集

2022-09-14 08:01:36

JoinMySQL迭代器

2011-06-09 10:20:43

朝鮮軟件開發

2015-03-19 14:08:12

2020-06-19 10:02:53

JVMJava語言

2013-10-30 09:42:38

Facebook圖搜索大數據

2017-05-16 09:56:44

2023-07-31 07:25:27

2019-12-05 12:11:37

DevOps開發應用程序

2020-04-15 13:55:28

Kubernetes容器

2011-11-15 08:53:52

用戶

2016-12-08 16:47:06

2022-02-07 21:49:06

瀏覽器渲染chromium

2022-05-05 11:16:20

AI隱私算法

2011-08-29 09:59:26

2020-09-15 12:57:46

C 語言浮點數內存

2013-11-27 11:04:05

震網病毒震網Stuxnet

2016-03-09 13:37:48

Twitter數據科學大數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美激情网 | 在线视频国产一区 | jlzzjlzz国产精品久久 | 六月婷婷久久 | 久草99| 日本爱爱视频 | 国产精品久久在线 | jlzzjlzz欧美大全 | 日韩欧美国产一区二区三区 | 国产精品久久久久无码av | 国产丝袜一区二区三区免费视频 | 国产91综合一区在线观看 | av三级在线观看 | 国产一区二区三区四区在线观看 | 亚洲高清视频在线观看 | 国产精品日韩一区二区 | 欧美精品中文字幕久久二区 | 热久久999| 精品欧美乱码久久久久久 | 男女激情网 | 天堂一区二区三区 | 青青99 | 青青久久av北条麻妃海外网 | 精品无码久久久久久国产 | 天天干.com| 一级日批片| 中文字幕在线一区二区三区 | 亚洲+变态+欧美+另类+精品 | 色综合视频 | 一级毛片免费 | 久久久久成人精品 | 国产亚洲精品区 | 免费看a | 91xh98hx 在线 国产 | 一区二区三区四区国产精品 | 在线91| 欧美日韩精品一区二区三区四区 | 在线观看成人精品 | 日本一区二区三区在线观看 | 日本在线中文 | 天堂av资源 |