实现一个多进程并发的服务器

      最后更新:2022-07-02 02:30:17 手机定位技术交流文章

      项目来源:登录-专业资讯科技笔测试面试准备平台_牛客网

      课程教导如何使用插座API实现基于TCP的多进程并行服务器。 在实现服务器之前,首先了解TCP通信的进程和所需的API。

      1.TCP通信流程

      在TCP通信中,发起的连接请求的一个端称为客户端,而被动接受的连接称为服务端。

      服务端:

      建立监视接口
      -监控:监控客户端连接
      -索克:索克文件描述索克()
      2.将该监视文件的文件描述符绑定到本地IP和端口(例如绑定端口地址信息)..bind()
      -这是当客户端连接到服务器时使用的IP和端口
      3.为设置监视,监视文件描述器开始工作(客户端索克文件发送数据到服务端索克文件的读缓冲区,服务端索克是没有数据的自读缓冲区的监视,程序由操作系统完成)
      -监视本身不接受请求,发现缓冲区连接后将进入下一步
      4.锁定等待到客户端启动连接,然后接收客户端连接后再生成与客户端通信的另一个接口。
      Windows:recv()/send() Linux:read()/write()
      通信结束,关闭连接。

      为什么需要启动另一套接口来与客户进行通信,然后听取请求?

      假设两个客户端连续启动连接并接受连接并与同一接口进行通信,接受第一个客户端连接后,接口开始通信,这时,第二个客户也发出了进来的请求,如果要求被接受,你必须与两个客户同时通信,索克文件只能记录客户端的地址信息,这不就乱套了吗。因此, 必须 区分 接受 连接 的 接口 和 用于 通信 的 接口,一个接口被用来接受连接,有多少连接是多少新的接口来通信。

      这也反映了TCP导向的连接的特性,即通信只能是单一接口,一个接口与一个接口相符。

      客户端:

      1.创建通信接口(由os自动分配的端口号码)..socket()
      2.连接服务器需要设置目标服务器的IP和端口..connect()
      3.连接成功,进行通信..发送()
      4.结束通信,切断连接..关闭()

      2.socket API

      所有socket API需要导入头文件#include<arpa/inet.h>

      • socket()

      参数:

      -域:指定地址协议家族。

      一般值: AF_INET(IPv4), AF_INET6(IPv6)

      -类型:在通信过程中使用的协议类型。

      通用值:SOCK_STREAM(流程协议),SOCK_DGRAM(消息协议)

      -协议:需要使用的特定协议。

      一般写为0, os 是自动从头两个值导出的。

      返回值:

      成功:返回索克文件描述符

      失败:-1

      在这里,返回文件描述符再次描述了索克的性质为文件。 一旦一个索克被创建,它可以被返回的文件描述符用于其他函数,以操作索克,就像操作文件一样。

      • bind()

      参数:

      -sockfd:用于连接的插座文件描述符。

      -addr:服务终结过程的接口信息

      这里的矩阵使用struct sockaddr*类型。实际输入矩阵通常不是这种类型,需要输入

      -addrlen:添加剂的长度

      返回值:

      失败:-1

      • listen()

      参数:

      -Sockfd: 同样的

      -backlog:请求队列长度

      服务器进程可能收到多个客户端请求,在最后一个请求完成之前输入的新请求将被缓冲到一个叫请求队列的队列结构中。

      返回值:

      失败:-1

      • accept()

      参数:

      -Sockfd: 同样的

      -addr:返回客户端的索克地址信息

      -addrlen:添加剂的长度

      返回值:

      成功:返回用于与添加器指定的客户端通信的新索克文件描述符

      失败:-1

      • connect()

      参数: samebind()

      返回值:

      成功:0

      失败:-1

      • write()、read()

      参数:

      -fd:通信用接口文件描述符

      -buf:你想写/读的数据。write将数据写入写缓冲区,读取数据从读缓冲区

      -count:buf长度

      3.多重服务器代码实例

      实例程序显示了一个反馈客户端,即客户端输入数据,服务端返回相同的数据。

      每当一个服务端接收连接时,它就会打印连接的客户端IP和端口号码。

      多个客户端可以同时访问,服务器将为每个请求新的接口维护通信的客户端创建多个子进程。

      服务结束: server_process.c

      客户:Client.c

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/28952.html

          热门文章

          文章分类