tcp服务器客户端编程流程
- 一.c/s模型
- 1.什么是c/s模型?
- 2.c/s模型的逻辑
- 二.TCP服务器端和TCP客户端的工作流程
- 1.流程
- 2.TCP三次握手
- 3.TCP四次挥手
一.c/s模型
1.什么是c/s模型?
答:(c/s)模型即(客户端/服务器端)模型
所有的客户都通过服务器端访问所需资源.
模型如图所示:
2.c/s模型的逻辑
C/S 模型的逻辑很简单。服务器启动后,首先创建一个(或多个)监听 socket,并调用 bind 函数将其绑定到服务器感兴趣的端口上,然后调用 listen 函数等待客户连接。服务器稳定运行之后,客户端就可以调用 connect 函数向服务器发起连接了。由于客户连接请求是随机到达的异步事件,服务器需要使用某种 I/O 模型来监听这一事件。I/O模型有多种,服务器使用的是 I/O 复用技术之一的 select 系统调用。当监听到连接请求后,服务器就调用 accept 函数接受它,并分配一个逻辑单元为新的连接服务。逻辑单元可以是新创建的子进程、子线程或者其他.服务器给客户端分配的逻辑单元是由 fork 系统调用创建的子进程。逻辑单元读取客户请求,处理该请求,然后将处理结果返回给客户端。客户端接收到服务器反馈的结果之后,可以继续向服务器发送请求,也可以立即主动关闭连接。如果客户端主动关闭连接,则服务器执行被动关闭连接。至此,双方的通信结束。需要注意的是,服务器在处理一个客户请求的同时还会继续监听其他客户请求,否则就变成了效率低下的申行服务器了(必须先处理完前一个客户的请求,才能继续处理下一个客户请求),服务器同时监听多个客户请求是通过 select 系统调用实现的。
二.TCP服务器端和TCP客户端的工作流程
1.流程
- socket()方法是用来创建一个套接字,有了套接字就可以通过网络进行数据的收发。这也是为什么进行网络通信的程序首先要创建一个套接字。创建套接字时要指定使用的服务类型,使用 TCP 协议选择流式服务(SOCK_STREAM) 。
- bind()方法是用来指定套接字使用的 IP 地址和端口。 IP 地址就是自己主机的地址,如果主机没有接入网络,测试程序时可以使用回环地址“127.0.0.1”。端口是一个 16位的整形值,一般 0-1024 为知名端口,如 HTTP 使用的 80 号端口。这类端口一般用户不能随便使用。其次, 1024-4096 为保留端口, 用户一般也不使用。 4096 以上为临时端口,用户可以使用。在Linux 上, 1024 以内的端口号,只有 root 用户可以使用
- listen()方法是用来创建监听队列。 监听队列有两种,一个是存放未完成三次握手的连接,一种是存放已完成三次握手的连接。 listen()第二个参数就是指定已完成三次握手队列的长度。
- accept()处理存放在 listen 创建的已完成三次握手的队列中的连接。每处理一个连接,则accept()返回该连接对应的套接字描述符。如果该队列为空,则 accept 阻塞。
- connect()方法一般由客户端程序执行,需要指定连接的服务器端的 IP 地址和端口。该方法执行后,会进行三次握手, 建立连接。
- send()方法用来向 TCP 连接的对端发送数据。 send()执行成功,只能说明将数据成功写入到发送端的发送缓冲区中,并不能说明数据已经发送到了对端。 send()的返回值为实际写入到发送缓冲区中的数据长度。
- recv()方法用来接收 TCP 连接的对端发送来的数据。 recv()从本端的接收缓冲区中读取数据,如果接收缓冲区中没有数据,则 recv()方法会阻塞。返回值是实际读到的字节数,如果recv()返回值为 0, 说明对方已经关闭了 TCP 连接。
- close()方法用来关闭 TCP 连接。此时,会进行四次挥手。