需求描述
在TCP通讯的时候,客户端必须主动联系服务器,这样才能实现通讯。服务器与客户端之间的连接是一种长连接,一旦连上一般是不会断开的。
在STM32上启动一个TCP的服务端,在电脑上用TCP客户端去连接服务端。客户端给服务端发送数据后,服务端再原封不动的返回给客户端。
思路
名词
Client:客户端----发起连接请求
Server:服务器----要连接的节点
CS架构(拥有客户端和服务器的):网络游戏,下载客户端,核心数据去请求服务器
BS架构(不用客户端直接直接是浏览器):网页游戏,客户端资源同样请求服务器下载到网页,核心数据去请求服务器。
socket: 利用操作系统提供的port(端口)和IP地址,实现网络中不同计算机间的数据交换
RAW:生的
config:配置
listen:听
established:确定的
closed:关闭
第一步逻辑:
stm32作为服务器,w5500作为网卡与作为客户端的电脑进行连接。电脑启动一个客户端发送一个连接请求,连上之后,主动给服务器发一个数据,然后服务器收到数据,返回相应的数据。
TCP连接需要通过端口进行连接。
第二步查看W5500寄存器:
Socket端口寄存器
MR:模式寄存器
ND:no delay ACK 无延时应答
P3~P0:协议TCP配置0001
CR:配置寄存器
OPEN:打开:如果是TCP----SR-SOCKINIT(0x13)
LISTEN:只在TCP服务端配置,连接请求成功后,LISTEN变为ESTABLIESHE,连接失败:LISTEN变为CLOSED
CONNECT:作为客户端是使用
DISCON:执行四次挥手断开操作。0x08
CLOSE:关闭socket,强行关闭0x10
SEND:发送缓冲区发送当前缓冲区的所有数据
SEND_KEEP:心跳包证明还在连接。
RECV:将接收缓冲区的数据提取出来。
IR:中断寄存器
许多中断标志位
PORT:源端口寄存器
配置本地的端口号
DHAR:目标MAC地址寄存器
DIPR:目标IP地址寄存器
DPORT:目标端口寄存器
IMR:中断屏蔽寄存器
RSR:空闲接收缓存寄存器
SR:状态寄存器
CLOSED:0x00关闭状态
INIT:初始化状态
LISTEN:监听状态
ESTABLISHED:建立连接状态
CLOSE_WAIT:半关闭状态
第三步服务器状态流程图
涉及函数
启动TCP服务器
//1 获取当前的状态get
getSn_SR:获取SR状态寄存器的数据
// 2. 判断当前状态,执行相应操作,进入下一个状态
// 2.1 如果是关闭状态,就打开socket
(socket.c)socket:打开socket
//2.2 如果是INIT状态,就执行监听,启动服务端
listen:监听函数
//2.3 如果是半关闭状态,就直接关闭socket
(socket.c)close:关闭函数
接收数据:
// 根据事件标志位,判断是否接收到数据;如果接收到,就读取到缓冲区
getSn_IR:提取标志位IR寄存器
//清零标志位(写1清0)
setSn_IR:
//读取数据长度
//读取数据
(socket.c)recv:
发送数据
// 1. 获取socket状态
getSn_SR:
// 2. 判断如果是建立连接状态,就接收数据
(socket.c)send:
主函数中:记得数据长度清0。