hello~ 很高兴见到大家! 这次带来的是Linux网络中关于网络基础这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢?
个 人 主 页: 默|笙
文章目录
- 一、Echo Server
- 1.1 理解 TCP 函数
- 1. listen
- 2. accept
- 3. read 与 write
- 4. connect
代码:tcp回响代码
一、Echo Server
1.1 理解 TCP 函数
1. listen
- TCP 与 UDP 的通信机制不同。TCP 是面向连接的协议,通信前需要建立稳定连接;UDP 是无连接协议,好比邮寄快递、发送邮件,发送方发出数据即可,不需要接收方同时在线。而 TCP 如同打电话,通信双方必须同时在线并成功建立连接后,才能交互数据。因此 TCP 与 UDP 服务端使用的系统调用函数存在差异。
- listen函数用于将 TCP 套接字设置为监听状态,backlog参数代表连接等待队列的最大长度,通常设置为 5,无需配置过大。成功设置返回0,不成功返回-1。
可以用餐厅举例理解 backlog:把服务端当作餐厅,已经入座就餐的客人代表已经建立连接、正在通信的客户端。backlog就是餐厅允许在店内等候的排队人数上限。当排队的连接请求数量达到上限,新到来的连接请求会被拒绝,避免大量请求堆积影响已建立连接的通信。
2. accept
作用:从监听套接字的等待队列里取出一个已经完成 TCP 三次握手的新连接,返回一个新的套接字描述符,专门用来和这个客户端通信。
1、accept 函数的参数规则:第一个参数必须传入已完成绑定、处于监听状态的套接字文件描述符;第二个、第三个参数为输出型参数,调用函数后会自动获取并存储客户端的 IP、端口等地址信息,若无需获取客户端地址,可传空值。
2、accept 函数返回值规则:函数调用失败时返回 -1;调用成功时,会生成并返回一个全新的套接字文件描述符。
监听套接字 与 accept 返回的通信套接字 核心区别:
我们可以用饭店服务场景直观理解:处于监听状态的原始套接字,就像饭店门口专门负责揽客的服务员A,只负责监听、接收客户端的连接请求,完成TCP三次握手,只揽客、不服务,全程固定不变,持续等待新的客户端连接。
而 accept 成功后返回的新套接字,是服务员A成功招揽到客人后,专门分配出来一对一服务当前客人的专属服务员B。后续和该客户端的数据收发、通信交互,全部由这个新套接字完成。
每接入一位新客户端,accept 就会生成一个全新的专属套接字(新服务员),各个套接字相互独立、各司其职。而原始的监听套接字(服务员A)始终只负责监听新连接,永远不参与具体的数据通信工作。
- accept 不是只取特定的一个新连接,如果当前这个取出失败了,不要直接退出程序,而是continue让accept去取下一个。
3. read 与 write
- 因为其实套接字也是一种文件,从网络中读写数据,用read 和write其实就足够了,虽然tcp也有专门的读写函数,但其实与read和write这两个接口相差不大。
4. connect
客户端发起 TCP 连接请求,向服务端发送 SYN,尝试建立 TCP 三次握手。
- connect 函数第一个参数,是客户端通过 socket 创建得到的套接字文件描述符;第二个、第三个参数为输入型参数,用于存放目标服务端的地址信息。
- 函数返回值:连接成功返回 0,连接失败返回 - 1,错误信息会存入全局变量 errno。
- 连接成功后,后续客户端就可以通过 sockfd 进行读写网络数据了。
- 剩下的看一遍 gitee 上的代码,三个版本,多进程,多线程,进程池。