文章目录
- 1、TCP介绍
- 2、W5500简介
- 2.1 关键函数
- socket
- listen
- send
- getSn_RX_RSR
- recv
- 自动心跳包检测
- getSn_SR
1、TCP介绍
TCP 服务端:
- 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。
- 绑定套接字[bind]:服务器将套接字绑定到一个网络接口上,通常是本地IP地址,并指定一个端口号,客户端将通过这个端口来连接服务器。
- 监听套接字[listen]:服务器开始监听来自客户端的连接请求。
- 接受连接[accept]:当服务器监听到客户端的连接请求时,它将接受这个连接,并创建一个新的套接字来处理与该客户端的通信。服务器可以同时接受多个客户端的连接。
- 发送和接收数据[send/recv]:服务器通过这个新的套接字与客户端进行数据交换。 6. 关闭连接:数据交换完成后,服务器可以关闭与客户端的连接。
TCP客户端:
- 创建套接字[socket]:客户端创建一个套接字。
- 连接到服务器[connet]:客户端连接到服务器的IP地址和端口。
- 发送和接收数据[send/recv]:一旦连接建立,客户端就可以通过套接字发送请求并接收服务器的响应。
- 关闭连接:数据交换完成后,客户端可以关闭套接字,结束与服务器的通信。
2、W5500简介
特点:
支持硬件 TCP/IP 协议:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
支持 8 个独立端口(Socket)同时通讯
支持掉电模式,支持网络唤醒
支持高速串行外设接口(SPI 模式 0,3)
内部 32K 字节收发缓存
内嵌 10BaseT/100BaseTX 以太网物理层(PHY)
支持自动协商(10/100-Based 全双工/半双工)
不支持 IP 分片
2.1 关键函数
socket
功能:socket如果处于关闭状态,则用于创建套接字[socket]、绑定套接字[bind]。
/**
*@brief This Socket function initialize the channel in perticular mode,
and set the port and wait for W5200 done it.
*@param s: socket number.
*@param protocol: The socket to chose.
*@param port:The port to bind.
*@param flag: Set some bit of MR,such as **< No Delayed Ack(TCP) flag.
*@return 1 for sucess else 0.
*/
uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag)
描述:按照传递的参数初始化并打开socket s
参数:s socket号(0-7)
参数:protocol 指定要运行的协议类型(Sn_MR_XXX)
参数:port 绑定的端口号,如果为0则自动分配
参数:flag socket flags,见SF_XXXXXXX
返回:s 如果成功
SOCKERR_SOCKNUM 如果socket号无效
SOCKERR_SOCKMODE 不支持的socket模式
SOCKERR_SOCKFLAG 无效的socket flags.
listen
功能:socket开始监听
/**
*@brief This function established the connection for the channel in passive (server) mode.
This function waits for the request from the peer.
*@param s: socket number.
*@return 1 for success else 0.
*/
uint8 listen(SOCKET s)
send
功能:在socket上的tcp链接成功建立后,可以调用send函数来发送数据。
/**
*@brief This function used to send the data in TCP mode
*@param s: socket number.
*@param buf: data buffer to send.
*@param len: data length.
*@return 1 for success else 0.
*/
uint16 send(SOCKET s, const uint8 * buf, uint16 len)
getSn_RX_RSR
功能:几号sockedt 接收到数据长度。
/**
*@brief This fuction is to give size of received data in receive buffer.
*@param s: socket number
*@return socket TX free buf size
*/
uint16 getSn_RX_RSR(SOCKET s)
recv
功能: 接收TCP socket上连接的对象发来的数据
/**
*@brief This function is an application I/F function which is used to receive the data in TCP mode.
It continues to wait for data as much as the application wants to receive.
*@param s: socket number.
*@param buf: data buffer to receive.
*@param len: data length.
*@return received data size for success else 0.
*/
uint16 recv(SOCKET s, uint8 * buf, uint16 len)
自动心跳包检测
个人使用send_Ka函数如下,手动每隔3S自动发送心跳包。
void send_Ka(SOCKET s)
{
IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND_KEEP);
return;
}
void setKeepAlive(SOCKET s,uint8_t timeout)
{
IINCHIP_WRITE(Sn_KPALVTR(s),timeout);
}
getSn_SR
读取Socket sn状态机
/**
*@brief This function is to get socket status
*@param s: socket number
*@return socket status
/* Sn_SR values */
*#define SOCK_CLOSED 0x00 /**< closed */
*#define SOCK_INIT 0x13 /**< init state */
*#define SOCK_LISTEN 0x14 /**< listen state */
*#define SOCK_SYNSENT 0x15 /**< connection state */
*#define SOCK_SYNRECV 0x16 /**< connection state */
*#define SOCK_ESTABLISHED 0x17 /**< success to connect */
*#define SOCK_FIN_WAIT 0x18 /**< closing state */
*#define SOCK_CLOSING 0x1A /**< closing state */
*#define SOCK_TIME_WAIT 0x1B /**< closing state */
*#define SOCK_CLOSE_WAIT 0x1C /**< closing state */
*#define SOCK_LAST_ACK 0x1D /**< closing state */
*#define SOCK_UDP 0x22 /**< udp socket */
*#define SOCK_IPRAW 0x32 /**< ip raw mode socket */
*#define SOCK_MACRAW 0x42 /**< mac raw mode socket */
*#define SOCK_PPPOE 0x5F /**< pppoe socket */
*/
uint8 getSn_SR(SOCKET s)
{
return IINCHIP_READ(Sn_SR(s));
}
状态 | 描述 |
---|---|
SOCK_CLOSED | socket处于关闭状态,资源被释放。disconnect或close命令生效后,或者超时后,无视之前状态变为这个状态此时无法通信 |
SOCK_INIT | socket以TCP模式打开,然后才可以调用connect或listen。通过正确地调用socket函数以转变为这个状态 |
SOCK_LISTEN | socket正以TCP服务器模式运作,并正在等待(监听)连接请求 |
SOCK_SYNSENT | socket发送了一个连接请求包(SYN包),这是从SOCK_INIT使用connect命令后的中间状态,如果随后收到了“接受连接”(SYN/ACK包),则会转为SOCK_ESTABLISHED;否则在超时后会转为SOCK_CLOSED,同时会设置超时中断标志位 |
SOCK_SYNRECV | socket接收到了“请求连接”(SYN包),如果随后发送答复(SYN/ACK包)成功,则会转为SOCK_ESTABLISHED;否则在超时后会转为SOCK_CLOSED,同时会设置超时中断标志位 |
SOCK_ESTABLISHED | socket tcp连接已建立,即在SOCK_LISTEN状态下收到了tcp客户端发来的SYN包并答复成功,或使用connect命令成功后会转变为的状态。 |
SOCK_FIN_WAIT SOCK_CLOSING SOCK_TIME_WAIT | 表明socket正在关闭。它们是tcp链接主动或被动关闭的中间状态 |
SOCK_CLOSE_WAIT | 表明socket正在关闭。这个状态说明socket收到了tcp链接的另一方发来的“断连请求”(FIN包)。这是半关闭状态,可以继续发送数据。发送完后应该调用disconnect或者close来完全关闭。 |
SOCK_LAST_ACK | 表明socket正在被动关闭状态下。这个状态说明socket正在等待对“断连请求”(FIN包)的答复(FIN/ACK包)。当成功收到答复或者超时后会变为SOCK_CLOSED状态。 |
SOCK_UDP | socket正以UDP模式运作。通过正确地调用socket函数以转变为这个状态 |
SOCK_IPRAW | IP raw模式。本文不涉及这方面内容。 |
SOCK_MACRAW | MACRAW模式。本文不涉及这方面内容。 |