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个客户端处于连接待状态,如果接收到更多的连接请求就忽略。

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


查看系统默认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 首先让我们看下下面的图(重点注意红色的箭头)

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

  1. 首先客户端(client)发一个SYN 1000(0字节)请求给客户端,希望与服务器建利连接
  2. 服务器端(server)接收到之后返回ACK(接受客户端发来的字节数 1000+1),在发送SYN 8000(0)字节同时也希望和客户端建立连接。
  3. 客户端接收到服务器端的ACK回应之后再返回ACK(服务器端发来的SYN 8000+1)给服务器端,这样客户端和服务器端就建立了连接。

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

-

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

-

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

-

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

书上的图:(更容易理解): ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191031203439767.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlYXJRaUhhbw==,size_16,color_FFFFFF,t_70)

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

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

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

  1. linux网络编程之Listen函数参数介绍

    1.listen()函数介绍 listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器, ...

  2. 网络编程之listen函数

    基本TCP客户端/服务器程序的套接字函数 listen函数仅由TCP服务调用,它做两件事 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect连接的 ...

  3. 网络编程之accept函数和accept函数在三次握手中的位置

    accept函数实际上是在三次握手之后,具体原因请看文章结尾具体解释. 基本TCP客户端/服务器程序的套接字函数 accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接(从这 ...

  4. 网络编程之bind函数

    基本TCP客户端/服务器程序的套接字函数 1.bind函数把一个本地协议地址赋予一个套接字.对于网际协议,协议地址是32位的IPv4地址或是128位的IPv6地址与16位的TCP或UDP端口号的组合. ...

  5. linux ioctl网络参数设置,Linux 网络编程之ioctl函数

    1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...

  6. unix网络编程之socket函数

    目录 作用 内容 参数 int family int type int protocol 返回值 int 说明 作用 为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,指定需要的 ...

  7. 网络编程之listen深入剖析

    #include <sys/socket.h>int listen(int s, int backlog); listen的第一个参数为待监听的套接字,第二个参数是已连接队列的大小. li ...

  8. 网络编程之listen与bind

    今天根据<Unix 网络编程>(卷1)第四章的4.4和4.5的习题要求:尝试把服务端的listen和bind分别去掉,看看会发生什么 首先把listen去掉,然后我发现我竟然这么做了,开始 ...

  9. linux网络编程之setsockopt()函数来设置socket状态以及getsockopt函数只用总结

    1.setsockopt函数 头文件:#include <sys/types.h> #include <sys/socket.h>定义函数:int setsockopt(int ...

最新文章

  1. 云计算的认识和看法_【云计算】如何理解云计算才是正确的?
  2. Verilog初级教程(11)Verilog中的initial块
  3. 分布式事务中间件 Fescar - 全局写排它锁解读
  4. GDCM:gdcm::Filename的测试程序
  5. VirtualBox中的网络连接方式详解
  6. cisco LAP upgrade to Fat AP
  7. 在Vmware下linux与ARM开发板的NFS系统搭建【ZT】
  8. 【洛谷P3410】拍照题解(最大权闭合子图总结)
  9. JFreeChart画折线图
  10. 倍福TwinCAT软件安装及注意事项
  11. MarkDown数学公式基本语法
  12. MySQL调优(二)——索引最佳实践
  13. 【C++ 程序】 复数类 (Complex)
  14. 基于python-opencv的图像中截取多边形区域
  15. PL/SQL 如何查看当前连接信息以及SQL PLUS如何指定IP地址
  16. Microsoft Edge浏览器崩溃,错误代码: STATUS_STACK_BUFFER_OVERRUN
  17. ROS安装:一键解决人生烦恼
  18. Question Retrieval with Distributed Representations and Participant Reputation in Community QA论文笔记
  19. Flutter Riverpod 全面深入解析,为什么官方推荐它?
  20. mysql intersect 使用方法_MySQL查询优化一例——也说说 Using intersect

热门文章

  1. 关于拷贝常规数组、std::array和std::vector速度的一些测试
  2. Golang的io.go和io.pipe库的笔记
  3. 第一章 密码学和加密交易的介绍
  4. 中国啮齿动物口器行业市场供需与战略研究报告
  5. 第12章 粒子同心圆(《Python趣味创意编程》教学视频)
  6. java 线程不足_jvm - 如何在没有运行缺点的Windows上获取Java进程的线程和堆转储...
  7. java linklist 遍历_Java LinkList遍历方式
  8. 他开发了 redux,昨晚字节一面却挂了?
  9. 招程序员不要信中医的? | 从编程的角度看中医
  10. 聊聊下一代监控:Prometheus