LWIP应用指南学习。
一 TCP接口函数:tcp_init() 必须在调用其它TCP函数之前调用,必须用一个硬件定时器来配置每TCP_FAST_INTERVAL (ms)调用一次tcp_fasttmr() ;每TCP_SLOW_INTERVAL (ms)调用一次tcp_slowtmr().
二 UDP接口函数:
2.1创建:struct udp_pcb *udp_new(void),对应的删除void udp_remove(struct udp_pcb *pcb),调用创建之后就不需要改网络连接来通讯了,删除以释放占用资源。
2.2绑定本地IP和端口号:err_t udp_bind(struct udp_pcb *pcb,struct ip_addr *ipaddr,u16_t port)
2.3将指定的PCB连接到远程主机(不收发任何网络数据)err_t udp_connect(struct udp_pcb *pcb,struct ip_addr *ipaddr,u16_t port),对应的是断开连接void udp_disconnect(struct udp_pcb *pcb)
2.4连接后就可以调用发送函数将pbuf数据通过PCB(指定的ip和端口号,如果没有指定该函数将随机分配一个端口号发送出去)发送出去,err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
2.5err_t udp_sendto(struct udp_pcb *pcb,struct pbuf *p,struct ip_addr *dst_ip,u16_t dst_port)相当于2.3和2.4的组合,如果在调用该函数之前调用了2.3,则2.3的端口和IP将被该函数覆盖。
2.6数据接收:void udp_recv(struct udp_pcb *pcb,void (* recv)(void *arg, struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port),void *recv_arg)函数recv是收到数据时的回调函数需要自行设计,最后一个是回调函数的参数。
三UDP例子解析
3.1UDP客户端
struct pbuf *p;
p = pbuf_alloc(PBUF_RAW,sizeof(UDPData),PBUF_RAM);
p->payload=(void *)UDPData;//指定发送缓冲区
IP4_ADDR(&ipaddr,192,168,1,16);//设定远程服务器IP
UdpPcb = udp_new();
udp_bind(UdpPcb,IP_ADDR_ANY,1025); /* 绑定本地 IP 地址 和端口号*/
udp_connect(UdpPcb,&ipaddr,1025); /* 连接远程主机和端口 */
while(1)
{
udp_send(UdpPcb,p); //向远程服务器发送数据
。。。
}
3.2TCP_WebSever:
void http_init(void)
{
struct tcp_pcb *pcb;
pcb = tcp_new(); /* 建立通信的 TCP 控制块(pcb) */
tcp_bind(pcb,IP_ADDR_ANY,80); /* 绑定本地 IP 地址和固定端口号80 */
pcb = tcp_listen(pcb); /* 进入监听状态 */
tcp_accept(pcb,http_accept); /* 设置有连接请求时的回调函数 */
}
static err_t http_accept(void *arg,struct tcp_pcb *pcb,err_t err)
{
tcp_setprio(pcb, TCP_PRIO_MIN); /* 设置回调函数优先级,当 存在几个连接时特别重要 此函数必须调用*/
tcp_recv(pcb,http_recv); /* 设置 TCP 段到时的接收回调函数 */
err = ERR_OK;
return err;
}
3.3TCP客户端:
void TCP_Client_Init()
{
struct tcp_pcb *Clipcb;
struct ip_addr ipaddr;
IP4_ADDR(&ipaddr,192,168,1,16);//远端服务器IP
Clipcb = tcp_new(); /* 建立通信的 TCP 控制块(Clipcb) */
tcp_bind(Clipcb,IP_ADDR_ANY,1026); /* 绑定本地 IP 地址和端口号 */
tcp_connect(Clipcb,&ipaddr,1026,TcpCli_Connected);//有连接时的回调函数
}
err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0); /* 客户端连接上主机后发送的测试数据 */
tcp_close(pcb);
return ERR_OK;
}
相关文章
- 端应用研发进入云原生时代
- Linux 学习笔记_12_文件共享服务_2_FTP应用--vsftpd
- 【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍
- 查全率(Recall),查准率(Precision),灵敏性(Sensitivity),特异性(Specificity),F1,PR曲线,ROC,AUC的应用场景
- 35个Jquery应用实例
- Android:双击退出应用的实现
- 消息队列有哪些应用场景?
- ELK学习笔记之logstash的各个场景应用(配置文件均已实践过)
- INSPIRE PRO 无人机航拍在世界遗产江郎山三维重建的应用
- Python3入门机器学习经典算法与应用 第3章 更多相关操作
- jQuery 练习:取出数组字典的值, 静态对话框, clone方法应用
- 机器学习为工业物联网应用爆发关键
- 中国人工智能学会通讯——机器学习在商务智能中的创新应用 1.3 结构化的知识
- 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项
- 工业智能网关BL110应用之40:实现台达 PLC Delta_DVP 接入金鸽Modbus云平台
- Android学习路径(23)应用Fragment建立动态UI——Fragment之间的通信
- 中国人工智能学会通讯——个性化推荐和资源分配在金融和经济中的应用 1.3 智能金融·分配定价
- 10.11杭州Clouder lab 十分钟搭建共享应用 2:如何通过日志服务实现用户的日志收集与分析
- 应用机器学习:传道解惑指南
- 学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup
- 【Spark深入学习 -14】Spark应用经验与程序调优
- 【Spark深入学习 -12】Spark程序设计与企业级应用案例02
- 以ActiveMQ为例JAVA消息中间件学习【4】——消息中间件实际应用场景
- 我的Android进阶之旅------>Android中查看应用签名信息
- 多线程之ThreadLocal理解、应用及源码分析