一、LWIP 中 RAW API 编程接口中与 TCP 相关的函数
二、LWIP TCP RAW API 函数
三、LwIP_Periodic_Handle函数
LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供时间并查询链路状态,该 函数有一个形参,用于指示当前时间,单位为 ms。 对于 TCP功能,每 250ms执行一次 tcp_tmr函数;对于 ARP,每 5s 执 行一次 etharp_tmr函数;对于链路状态检测,每 1s 执行一次ETH_CheckLinkStatus 函数; 对于 DHCP功能,每 500ms执行一次 dhcp_fine_tmr函数,如果 DHCP处于DHCP_START 或 DHCP_WAIT_ADDRESS 状态就执行LwIP_DHCP_Process_Handle 函数,对于 DHCP功 能,还有每 60s 执行一次 dhcp_coarse_tmr函数。
四、TCP客户端连接代码
tcpclinet.c
#include "tcpclient.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>
#include <string.h>
static struct tcp_pcb *client_pcb = NULL;
static void client_err(void *arg, err_t err)
{
tcp_close(client_pcb);//连接失败的时候释放TCP控制块的内存
TCP_Client_Init();//重新连接
}
static err_t client_send(void *arg, struct tcp_pcb *tpcb)
{
unsigned char send_buf[]= "hello server\n";
tcp_write(tpcb, send_buf, sizeof(send_buf), 1);//发送数据到服务器
return ERR_OK;
}
static err_t client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
{
if (p != NULL)
{
tcp_recved(tpcb, p->tot_len);/* 确认收到服务器发送的数据,更新窗口,服务器可以继续发送数据,否则重发数据 */
tcp_write(tpcb, p->payload, p->tot_len, 1);/* 返回接收到的数据*/
memset(p->payload, 0 , p->tot_len);
pbuf_free(p);
}
else if (err == ERR_OK)
{
printf("server has been disconnected!\n");//服务器断开连接
tcp_close(tpcb);
TCP_Client_Init();//重新连接
}
return ERR_OK;
}
static err_t client_connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
printf("connected ok!\n");
tcp_poll(pcb,client_send,2);//注册一个周期性回调函数,每2*0.5秒调用一次client_send函数,0.5s是内核定时器的处理周期
tcp_recv(pcb,client_recv);//注册一个接收函数
return ERR_OK;
}
void TCP_Client_Init(void)
{
ip_addr_t server_ip;
client_pcb = tcp_new();/* 创建一个TCP控制块 */
IP4_ADDR(&server_ip, 192,168,1,104);/*绑定服务器ip地址*/
tcp_connect(client_pcb,&server_ip,8080,client_connected);//开始连接
tcp_err(client_pcb, client_err);//注册异常处理
}
tcpclinet.h
#ifndef _TCPCLIENT_H_
#define _TCPCLIENT_H_
void TCP_Client_Init(void);
#endif
五、TCP服务器连接代码
tcpserver.c文章来源:https://www.toymoban.com/news/detail-848400.html
#include "tcpserver.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>
#include <string.h>
static err_t TcpServerRecv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
{
if (p != NULL)
{
tcp_recved(tpcb, p->tot_len);/* 更新窗口*/
tcp_write(tpcb, p->payload, p->tot_len, 1);/* 返回接收到的数据*/
memset(p->payload, 0 , p->tot_len);
pbuf_free(p);
}
else if (err == ERR_OK)
{
return tcp_close(tpcb);
}
return ERR_OK;
}
static err_t TcpServerAccept(void *arg,struct tcp_pcb *newpcb,err_t err)
{
tcp_recv(newpcb, TcpServerRecv);
return ERR_OK;
}
void TCPServerInit(void)
{
struct tcp_pcb *tcppcbnew; //定义一个TCP服务器控制块
struct tcp_pcb *tcppcbconn; //定义一个TCP服务器控制块
err_t err;
tcppcbnew=tcp_new(); //创建一个新的pcb
if(tcppcbnew) //创建成功
{
err=tcp_bind(tcppcbnew,IP_ADDR_ANY,8088); //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
if(err==ERR_OK) //绑定完成
{
tcppcbconn=tcp_listen(tcppcbnew); //设置tcppcb进入监听状态
tcp_accept(tcppcbconn,TcpServerAccept); //初始化LWIP的tcp_accept的回调函数
}
}
}
tcpserver.h文章来源地址https://www.toymoban.com/news/detail-848400.html
#ifndef _TCPSERVER_H_
#define _TCPSERVER_H_
void TCPServerInit(void);
#endif
到了这里,关于RAW 编程接口 TCP 函数简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!