TCP socket API 详解回顾程序中用到的socket API函数socket()对于IPv4family参数指定为AF_INET对于TCP协议,type参数指定为SOCK_STREAM表示面向流的传输协议bind()服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端 口号后就可以向服务器发起连接服务器需要调用bind绑定一个固定的网络地址和端口号bind()成功返回0,失败返回-1bind()的作用是将参数sockfd和myaddr绑定在一起使sockfd这个用于网络通讯的文件描述符监听myaddr所描述的地址和端口号因为struct sockaddr *是一个通用指针类型myaddr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同所以需要第三个参数addrlen指定结构体的长度多线程 TCPServer.hpplisten()listen()声明sockfd处于监听状态并且最多允许有backlog个客户端处于连接等待状态如果接收 到更多的连接请求就忽略设置不会太大(一般是5)listen()成功返回0,失败返回-1accept()如果服务器调用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 线程池版本引入系统部分的线程池进行简单的业务处理代码线程池版本实现