网络编程之 listen()函数的使用与三次握手的理解

简介: listen()函数在进入我们的函数讲解前大家再回顾一下编写服务器端的流程

listen()函数

在进入我们的函数讲解前大家再回顾一下编写服务器端的流程
服务器端:
socket()-->bind( )-->listen()-->accept()-->read()/write()--->close()
socket()//创建套接字
bind()//分配套接字地址
listen()//等待连接请求状态
accept()//允许连接
read()/write()//进行数据交换
close()//断开连接

相信大家对 socket()和 bind()应该不陌生了,那我们就再接再厉把 listen() 也拿下吧。


下面博主给出具体的函数


#include<sys/socket.h>
int listen(int sock, int backlog);
参数含义:
  第一个参数: int sock: 希望进入等待连接请求状态的套接字文件描述符,传递的描述符套接字参数成为服务器端套接字(监听套接字!!!!)
  第二个参数: int backlog: 连接请求等待队列的长度,若为5,则队列长度为5,表示最多使5个连接请求进入队列,其中也包含排队建立3次握手队列和刚刚建立3次握手队列的连接数之和
返回值:    成功: 0
          失败: -1

 

 典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。

博主认为下面这两张图对我们的两个参数解释得非常形象,就分享给大家看了。

20191031200321579.png

20191031200404428.png

查看系统默认backlog


cat /proc/sys/net/ipv4/tcp_max_syn_backlog


如何设置操作系统中backlog的值??

按照下面的步骤操作即可:


vim /etc/sysctl.conf


最后添加


net.core.somaxconn = 1024


net.ipv4.tcp_max_syn_backlog = 1024


保存,然后执行,就能更改系统默认的backlog


为什么要去更改backlog呢??

因为 listen()第二个参数表面上是让你自己设置,但是一旦你设置的数字超过了系统默认的 backlog那么系统就会选择默认的 backlog 你设置的参数就不起作用了。


三次握手

下面就有博主给大家分享一些比较专业的知识了(博主也许讲的不是很好,但是博主会尽自己最大努力去讲好的)------>介绍的是 TCP 首先让我们看下下面的图(重点注意红色的箭头)

20191031201508490.png


下面这张图就包含了三次握手和四次挥手(在后面的内容会介绍到的


20191031201642741.png

1.首先客户端(client)发一个SYN 1000(0字节)请求给客户端,希望与服务器建利连接

2.服务器端(server)接收到之后返回ACK(接受客户端发来的字节数 1000+1),在发送SYN 8000(0)字节同时也希望和客户端建立连接。


3.客户端接收到服务器端的ACK回应之后再返回ACK(服务器端发来的SYN 8000+1)给服务器端,这样客户端和服务器端就建立了连接。


这就是三次握手,通俗的来说就是:


-

套接字A:"你好,套接字B。我这里有数据要传递给你,我们建立连接吧"


-

套接字B:“好的,我这边已就绪”


-

套接字A:“谢谢你受理我的请求”


书上的图:(更容易理解): ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20191031203439767.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlYXJRaUhhbw==,size_16,color_FFFFFF,t_70)

如果其中的数据不一样就会发生下面的情况(给出书上),这也就是为什么说 TCP是面向连接的、可靠的、数据完整的基于字节流的连接的原因了。

20191031202351912.png


其中的原理就是 SYN与ACK做的。


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
机器学习/深度学习 测试技术 Python
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
143 0
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
|
2月前
|
网络协议 Linux API
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
91 0
|
2月前
|
存储 Unix Linux
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
15 0
|
2月前
|
网络协议 Linux C++
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
27 0
|
4月前
|
机器学习/深度学习 存储
【Matlab智能算法】Elman神经网络-遗传算法(Elman-GA)函数极值寻优——非线性函数求极值
【Matlab智能算法】Elman神经网络-遗传算法(Elman-GA)函数极值寻优——非线性函数求极值
|
4月前
|
机器学习/深度学习 存储
【Matlab智能算法】RBF神经网络-遗传算法(RBF-GA)函数极值寻优——非线性函数求极值
【Matlab智能算法】RBF神经网络-遗传算法(RBF-GA)函数极值寻优——非线性函数求极值
|
4月前
|
机器学习/深度学习 存储 算法
【程序员必须掌握的算法】【Matlab智能算法】GRNN神经网络-遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值
【程序员必须掌握的算法】【Matlab智能算法】GRNN神经网络-遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值
|
4月前
|
机器学习/深度学习 存储 算法
【Matlab智能算法】BP神经网络-遗传算法(BP-GA)函数极值寻优——非线性函数求极值
【Matlab智能算法】BP神经网络-遗传算法(BP-GA)函数极值寻优——非线性函数求极值
|
4月前
网络编程之 字节序和深入理解bind()函数
在上一篇博客里,大家也许会对htons()感到疑惑吧,其实就是字节序的转换,所以这篇博客我们就来详细的解释一下什么是字节序。
38 0
|
4月前
|
网络协议 Linux 定位技术
网络编程函数小总结与初识socket
总结服务器端的函数和客户端的函数 再次声明博主写的都是对于linux下的网络编程,没有写关于Windows的网络编程,也许以后会写到。 这里只是总结一下,具体参数的含义等后面的跟新
27 0