IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【lwip】第二篇:使用lwip的netconn接口编写TCP服务器 -> 正文阅读

[网络协议]【lwip】第二篇:使用lwip的netconn接口编写TCP服务器

一、netconn介绍

??参考链接:https://lwip.fandom.com/wiki/Netconn_API
??netconn API 是一个顺序API,旨在使lwip协议栈更易于使用(与事件驱动的原始 API 相比),同时仍保留零拷贝功能。
??要使用netconnAPI,需要一个操作系统,因为这个API需要使用线程。协议栈核心中的所有数据包处理(输入和输出)都是在一个专用线程内完成的-Tcpip线程)。应用程序线程使用邮箱和信号量与此专用线程通信。

二、netconn API

/*
创建netconn
t:netconn的类型,可取
  NETCONN_TCP       
  NETCONN_UDP       
  NETCONN_UDPLITE  
  NETCONN_UDPNOCHKSUM
  NETCONN_RAW 
返回:netconn句柄
*/
#define netconn_new(t)                  netconn_new_with_proto_and_callback(t, 0, NULL)
struct netconn* netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback)

/*
删除netconn
conn:netconn句柄
*/
err_t   netconn_delete(struct netconn *conn);
/*
获得netconn的ip和端口
conn:netconn句柄
addr:保存获取的ip
port:保存获取的端口
local:为1时获取本地地址、为1时获取远端地址
*/
err_t   netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local);

/*
绑定本地ip地址到netconn
conn:netconn句柄
addr:本地ip
port:本地端口
*/
err_t   netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port);
/*
连接到远端ip和端口
conn:客户端本地ip
port:客户端本地端口
*/
err_t   netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port);
/*
仅可用于UDP,断开连接
conn:netconn句柄
*/
err_t   netconn_disconnect (struct netconn *conn);

/*
将tcp的连接切换成listen模式
conn:netconn句柄
*/
#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG)
/*
tcp服务器获取新建立的连接,也就是监听到的连接
conn:旧的连接
new_conn:新的连接
*/
err_t   netconn_accept(struct netconn *conn, struct netconn **new_conn)

/*
接收数据
conn:连接
new_buf:数据包结构体
*/
err_t   netconn_recv(struct netconn *conn, struct netbuf **new_buf);
/*
tcp发送数据
conn:连接
dataptr:发送缓冲区
size:发送大小
apiflag:标志
*/
#define netconn_write(conn, dataptr, size, apiflags) \
          netconn_write_partly(conn, dataptr, size, apiflags, NULL)
/*
关闭tcp连接
conn:连接
*/
err_t   netconn_close(struct netconn *conn);

/*
udp发送数据
conn:连接
buf:数据包结构体
*/
err_t   netconn_send(struct netconn *conn, struct netbuf *buf);

三、netconn示例:编写TCP服务器

#include "my_netconn.h"
#include "lwip/opt.h"
#include "usart.h"

#if LWIP_NETCONN
#include "lwip/sys.h"
#include "lwip/api.h"

#define TCPECHO_THREAD_PRIO  (osPriorityAboveNormal)

static void mytcp_thread(void *arg)
{
   struct netconn *conn, *newconn;
   err_t err;
   
   u8_t  tx_buf[20];//发送缓冲区
   u16_t rx_len=0;
   u8_t *temp = "cnt:%d\r\n";
   u16_t cnt =0;//要通过TCP显示的计数值
  
   LWIP_UNUSED_ARG(arg);

   /* Create a new connection identifier. */
   /* Bind connection to well known port number 7. */
   conn = netconn_new(NETCONN_TCP);
   netconn_bind(conn, IP_ADDR_ANY, 7);

   LWIP_ERROR("my tcpdemo: invalid conn", (conn != NULL), return;);

   /* Tell connection to go into listening mode. */
   netconn_listen(conn);
   /* Grab new connection. */
   err = netconn_accept(conn, &newconn);
   printf("accepted new connection %p\n", newconn);
   /* Process the new connection. */
   if (err == ERR_OK) 
   {
     while (1) 
     {
	  sprintf(tx_buf,temp,cnt);
	  tx_len = strlen((const char *)tx_buf);
	  cnt++;
	  err = netconn_write(newconn, tx_buf, tx_len, NETCONN_COPY);
	  vTaskDelay(1000);
     }
   }
}
//创建tcp线程
void mytcp_init(void)
{
  sys_thread_new("tcpecho_thread", mytcp_thread, NULL, (configMINIMAL_STACK_SIZE*2), TCPECHO_THREAD_PRIO);
}
#endif /* LWIP_NETCONN */

四、测试

在这里插入图片描述

五、总结

使用netconn api首先使用netconn_new创建一个连接,接着可以对这个连接进行删除、查询ip和端口、绑定ip和端口、连接远端地址、监听、接收连接、接收数据、发送数据、关闭连接。非常简单的实现了TCP服务器。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:17:20  更:2021-07-17 12:19:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 13:56:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计