【Linux】Socket编程TCP

TCP socket API 详解

回顾程序中用到的socket API函数:

socket()

  • 对于IPv4,family参数指定为AF_INET
  • 对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议

bind()

  • 服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端 口号后就可以向服务器发起连接
  • 服务器需要调用bind绑定一个固定的网络地址和端口号
  • bind()成功返回0,失败返回-1
  • bind()的作用是将参数sockfd和myaddr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听myaddr所描述的地址和端口号
  • 因为struct sockaddr *是一个通用指针类型,myaddr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度
  • 多线程 TCPServer.hpp

listen()

  • listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接等待状态,如果接收 到更多的连接请求就忽略,设置不会太大(一般是5)
  • listen()成功返回0,失败返回-1

accept()

  • 如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来
  • addr是一个传出参数,accept()返回时传出客户端的地址和端口号
  • 如果给addr参数传NULL,表示不关心客户端的地址
  • addrlen参数是一个传入传出参数(value-result argument),传入的是调用者提供的,缓冲区addr 的c长度以避免缓冲区溢出问题,传出的是客⼾端地址结构体的实际长度

connect()

  • 客户端需要调用connect()连接服务器
  • connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对放的地址

1. V1 - Echo Server

思路:

根据实现发现由于:

  • 当启动一个客户端后再启动一个客户端,尝试连接服务器,发现第二个客户端不能正确的和服务器进行通信
  • 分析原因,是因为我们 accecpt 了一个请求之后,就在一直 while 循环尝试 read ,没有继续调用accecpt ,导致不能接受新的请求
  • 所所以单进程版本的TCP ,只能处理一个连接,这是不科学的

2. V2 - Echo Server多进程版本

思路:

代码实现:

TCP实现客户端echo 单进程+多进程版

3. V3 - Echo Server多线程版本

思路:

代码:

TCP多线程版本代码

4. V3-1 - 多线程远程命令执行

Command.hpp:命令类,⽤来执行命令,并获取结果

代码:

多线程远程命令执行

5. V4 - Echo Server 线程池版本

引入系统部分的线程池,进行简单的业务处理

代码:

线程池版本实现

相关推荐
小此方2 小时前
Re:Linux系统篇(二)指令篇 · 一:基础六大指令精讲+Linux操作技巧——让你从小白到入门
linux·服务器
xixixi777772 小时前
Gartner 2026核心趋势:前置式主动安全(PCS)成为安全战略新范式,量子安全+国密算法构筑政企纵深防御底座
网络·人工智能·安全·web安全·ai·量子计算
SilentSamsara2 小时前
ConfigMap 与 Secret:配置注入的四种姿势与安全边界
linux·运维·服务器·安全·微服务·kubernetes·k8s
Lentou2 小时前
部署项目之systemd部署
linux·运维·服务器
郭庆汝2 小时前
华为昇腾服务器安装docker
运维·服务器·docker
鄃鳕2 小时前
ubuntu下将DHCP动态分配改成静态ip
linux·tcp/ip·ubuntu
凭X而动2 小时前
CentOS7搭建SFTP
linux·运维·服务器
Johnstons2 小时前
TCP重传率飙升怎么查?一次生产环境排障的完整复盘
网络·网络协议·tcp/ip
IpdataCloud2 小时前
如何将IP查询API集成到网站或应用中?主流方案与选型对比
网络·网络协议·tcp/ip