UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example

news2024/12/18 21:09:36

文章目录

  • 1. TCP通信 客户端(关键配置)
  • 2. TCP 服务端配置
  • 3. UDP 点播通信
  • 4. UDP 广播通信
  • 5. UIP_UDP_APPCALL 里边的处理example
  • 6. TCP数据处理 ,UIP_APPCALL调用的函数

UIP_APPCALL TCP的数据都在这个宏定义的函数里进行数据处理的
UDP 数据在#define UIP_UDP_APPCALL udp_appcall 中处理

1. TCP通信 客户端(关键配置)


	// 定义 MAC 地址(6 字节)
	static const uint8_t mac_address[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
	// 设置 MAC 地址
	memcpy(ethaddr.addr, mac_address, sizeof(mac_address));
	uip_setethaddr(ethaddr);
    
	uip_ipaddr_t ipaddr;
	uip_init();                          // uIP初始化
	uip_ipaddr(ipaddr, 192, 168, 1, 137); // 设置本地设置IP地址
	uip_sethostaddr(ipaddr);
	uip_ipaddr(ipaddr, 192, 168, 1, 1); // 设置网关IP地址(其实就是你路由器的IP地址)
	uip_setdraddr(ipaddr);
	uip_ipaddr(ipaddr, 255, 255, 255, 0); // 设置网络掩码
	uip_setnetmask(ipaddr);
	
    uip_ipaddr_t ipaddr;
    uip_ipaddr(&ipaddr, 192, 168, 1, 100); // 设置TCP Server IP为192.168.1.100
    uip_connect(&ipaddr, htons(8080));     // 端口为1400

2. TCP 服务端配置

    uip_ipaddr_t ipaddr, remote_ip;

	// 定义 MAC 地址(6 字节)
	static const uint8_t mac_address[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
	// 设置 MAC 地址
	memcpy(ethaddr.addr, mac_address, sizeof(mac_address));
	uip_setethaddr(ethaddr);
	
    // uIP初始化
    uip_init();

    /* ARP table initialize. */
    uip_arp_init();

    /*-----------UIP-TCP-Server---------------------*/
    // 设置本地设置IP地址
    uip_ipaddr(ipaddr, 192, 168, 1, 137);
    uip_sethostaddr(ipaddr);

    // 设置网关IP地址(其实就是你路由器的IP地址)
    uip_ipaddr(ipaddr, 192, 168, 1, 1);
    uip_setdraddr(ipaddr);

    // 设置网络掩码
    uip_ipaddr(ipaddr, 255, 255, 255, 0);
    uip_setnetmask(ipaddr);

    // 设置 远程客户端IP为192.168.1.100
    uip_ipaddr(&remote_ip, 192, 168, 1, 100);
    uip_connect(&remote_ip, htons(7090)); /*连接到远程客户端的通信端口为7090 */

    /* We start to listen for connections on TCP port 8090. */
    uip_listen(HTONS(8090));

    /*-----------UIP-TCP-Server---------------------*/

3. UDP 点播通信


   uip_ipaddr_t remote_addr;
   struct uip_udp_conn *udp_conn;

   // 设置远程主机的 IP 地址为 192.168.1.100
   uip_ipaddr(&remote_addr, 192, 168, 1, 100);

   // 创建到 remote 192.168.1.100:1215 的 UDP 连接
   udp_conn = uip_udp_new(&remote_addr, HTONS(1215));

   if (udp_conn == NULL)
   {
       UART1_Send_String("Failed to create UDP connection! \r\n");
   }
   else
   {
       uip_udp_bind(udp_conn, HTONS(1234)); // 绑定本地端口 1234
   }

4. UDP 广播通信

UDP 广播需要打开这个宏

#ifndef UIP_CONF_BROADCAST
#define UIP_BROADCAST 1
#else /* UIP_CONF_BROADCAST /
#define UIP_BROADCAST UIP_CONF_BROADCAST
#endif /
UIP_CONF_BROADCAST */

   /*Broadcast IP ADDR*/
   uip_ipaddr_t Broadcast_addr;
   
   struct uip_udp_conn *udp_conn;

   // UDP广播地址,本局域网中的所有设备
   uip_ipaddr(&Broadcast_addr, 255, 255, 255, 255);

    /*UDP 广播端口1212*/
   udp_conn = uip_udp_new(&Broadcast_addr, HTONS(0));

   if (udp_conn == NULL)
   {
       UART1_Send_String("Failed to create UDP connection! \r\n");
   }
   else
   {
        uip_udp_bind(udp_conn, HTONS(3956));

   }

5. UIP_UDP_APPCALL 里边的处理example

    /*udp rx data*/
    if (uip_newdata())
    {
        #if (USE_GVCP==1)
            gvcp_discover_callback();
        #else
        char *data = (char *)uip_appdata;
        int len = uip_datalen();

        memset(udp_server_databuf, 0, 1500);

        memcpy((char *)udp_server_databuf,
                (char *)uip_appdata,
                uip_len);

        // 打印接收到的数据
        UART1_Send_String("[UDP_RX]:");
        UART1_Send_String(udp_server_databuf);
        UART1_Send_String("\r\n");

        #endif

    }


    // 当需要重发、新数据到达、数据包送达,通知uip发送数据
    if (uip_rexmit() || uip_newdata() || uip_poll())
    {
        #if (USE_GVCP==1)
    
        #else
    
        // 将数据复制到 uIP 的应用层数据缓冲区
        memcpy(uip_appdata, message, sizeof(message));

        // 发送数据
        uip_udp_send(sizeof(message));  // 发送的字节数
        #endif

    }

6. TCP数据处理 ,UIP_APPCALL调用的函数

/**
 * @brief 这是一个TCP 服务器应用回调函数。
 *  该函数通过UIP_APPCALL(tcp_demo_appcall)调用,实现Web Server的功能.
 * 当uip事件发生时,UIP_APPCALL函数会被调用,根据所属端口(1200),确定是否执行该函数。
 * 例如 : 当一个TCP连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件
 */
void tcp_server_demo_appcall(void)
{

    // 连接终止
    if (uip_aborted())
    {
        uip_log("TCP_Server Aborted!\r\n"); // 打印log
    }

    // 连接超时
    if (uip_timedout())
    {

        uip_log("TCP_Server Timeout!\r\n"); // 打印log
    }

    // 连接关闭
    if (uip_closed())
    {

        uip_log("TCP_server CLOSED!\r\n"); // 打印log
    }

    // 连接成功
    if (uip_connected())
    {
        uip_log("TCP_Server Connected OK!\r\n"); // 打印log

    }

    // 发送的数据成功送达
    if (uip_acked())
    {
        // uip_log("TCP_Server ACK OK!\r\n");

    }
    else
    {
        /*数据发送失败*/
        // uip_log("TCP_Server NOT ACK!\r\n");
    }

    /* 接收到一个新的TCP数据包,收到客户端发过来的数据*/
    if (uip_newdata())
    {

        memcpy(&request, uip_appdata, uip_len);

        if (PROTOCOL_REQUEST_MAGIC == request.header.nMagic)
        {
            // uip_log("Recive APP SDK Update!\r\n");
            protocol_handle_request(&request, &response);
        }
        else
        {
            uip_log("Recive APP Bin data ERROR! \r\n");
        }

        uip_send(&response, response.buf.len);

    }

}

/**
 * @brief TCP应用接口函数(UIP_APPCALL)
 *  完成TCP服务(包括server和client)
 */
void tcp_demo_appcall(void)
{

    switch (uip_conn->lport) // 本地监听端口80和1200
    {
        case HTONS(8090):
            tcp_server_demo_appcall();
            // uip_log("tcp_demo_appcall Local 8080 TCP Server!! \r\n");
    }

#ifdef TCP_Client

    /*tcp client use */
    switch (uip_conn->rport) // 远程连接8080端口
    {
        case HTONS(8080): // 一旦有来自远程主机的信息,就调用此函数
            // tcp_client_demo_appcall();
            // uip_log("tcp_demo_appcall Remote 8080 TCP Client!! \r\n");
            break;
    }

#endif

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window QT/C++ 与 lua交互(mingw + lua + LuaBridge + luasocket)

一、环境与准备工作 测试环境:win10 编译器:mingw QT版本:QT5.12.3 下载三种源码: LuaBridge源码:https://github.com/vinniefalco/LuaBridge LUA源码(本测试用的是5.3.5):https://www.lua.org/download.html luasocket源码:https://github.com/diegonehab/luasocket 目…

Docker在Ubuntu和CentOS系统下的安装

目录 1. 各版本平台支持情况2. 在Ubuntu系统下安装docker3. 常见报错4. Docker的镜像源修改5. Docker目录修改6. 在CentOS系统下安装docker 1. 各版本平台支持情况 (1)平台支持情况如下: Server 版本 桌面版本 2. 在Ubuntu系统下安装docker…

图形化界面MySQL(MySQL)(超级详细)

目录 1.官网地址 1.1在Linux直接点击NO thanks..... 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 优点和好处 示例代码(MySQL Workbench) 示例代码(phpMyAdmin) 总结 图形化界面 MySQL 工具大全及其功…

IP数据云查询IP归属地信息

互联网时代,我们每天都会面对大量的网站或App,但你们是否知晓,所有程序员进行程序或者系统的开发都离不开查询IP地址,这是由于对于每个安全的网站/软件来说,基础的服务日志,登录IP等就离不开IP归属地离线库&#xff0c…

PH热榜 | 2024-12-17

1. Eden 标语:一键用AI生成网页评论。 介绍:Eden是一款人工智能驱动的社交插件,只需点击表情符号就能在任何网页上评论。它能自动总结网页内容并生成个性化评论。 想调侃朋友、表达喜爱,还是快速评论几句?用Eden&…

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记 0-前置章节-环境准备 0.1 环境介绍 配置环境:hadoop-3.4.0,jdk-8u171-linux-x64 0.2 VMware准备Linux虚拟机 0.2.1主机名、IP、SSH免密登录 1.配置固定IP地址(root权限) 开启master,修改主机名为…

ChatGPT Search开放:实时多模态搜索新体验

点击访问 chatTools 免费体验GPT最新模型,包括o1推理模型、GPT4o、Claude、Gemini等模型! ChatGPT Search:功能亮点解析 本次更新的ChatGPT Search带来了多项令人瞩目的功能,使其在搜索引擎市场中更具竞争力。 1. 高级语音模式&…

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。 在PHP中,正则表达式一般是由正规字…

PHP代码审计学习(一)--命令注入

1、漏洞原理 参数用户可控&#xff0c;程序将用户可控的恶意参数通过php可执行命令的函数中运行导致。 2、示例代码 <?php echorec-test; $command ping -c 1 .$_GET[ip]; system($command); //system函数特性 执行结果会自动打印 ?> 通过示例代码可知通过system函…

CTFHub-ssrf

技能树--Web--SSRF 内网访问 开启题目 尝试访问位于127.0.0.1的flag.php吧 进入环境 根据提示输入即可 127.0.0.1/flag.php 伪协议读取文件 开启题目 尝试去读取一下Web目录下的flag.php吧 进入环境&#xff0c;根据提示输入 file:///var/www/html/flag.php 鼠标右键查看…

Stable Diffusion Controlnet常用控制类型解析与实战课程 4

本节内容&#xff0c;是stable diffusion Controlnet常用控制类型解析与实战的第四节课程。上节课程&#xff0c;我们陆续讲解了几个与图像风格约束相关的控制类型&#xff0c;本节课程我们再学习一些实用价值较高的控制类型&#xff0c;看一看他们提供了哪些控制思路。 一&…

DC-8笔记

靶机信息 官网地址:DC: 8 ~ VulnHub DC-8 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing.This challenge is a bit of a hybrid between being an actual challenge, and being a "proof of c…

购物商城案例 1-- VueCli创建项目,调整目录,vant组件库

基于VueCli创建项目 调整目录&#xff0c;新增两个目录 修改路由和App.vue 路由中规则清空 新建文件夹api和utils api文件夹&#xff1a;发请求的一些文件 utils文件夹&#xff1a;工具函数方法 vant组件库&#xff1a;第三方vue组件库 vant-ui 找到vant官网&#xff0c;进入va…

npm : 无法加载文件 D:\nodejs\npm.ps1

问题描述 npm run serve 启动一个Vue项目&#xff0c;报错如下&#xff1a; npm : 无法加载文件 D:\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…

12.17双向链表,循环链表

循环单向链表 1.头文件test.h #ifndef __TEST_H_ #define __TEST_H_#include<stdio.h> #include<stdlib.h>typedef struct node {union{int len;int data;};struct node *next; }looplink,*looplinkPtr;//创建 looplinkPtr create();//判空 int empty(); //申请…

【多模态】MiniCPM-V多模态大模型使用学习

MiniCPM-V模型使用 前言1. 模型文件下载和选择2. 环境安装配置3. 模型微调3.1 qlora微调minicpm-v-int43.2 lora微调minicpm-v3.3 merge_lora3.4 lora微调后量化int4 4. 模型推理4.1 huggingface API4.2 swift API(A) swift&#xff08;不支持batch inference&#xff09;(B) s…

VMware ubuntu12.04怎么设置静态IP联网

记得刚开始学习嵌入式就是从ubuntu12.04的环境开始学习的C语言&#xff0c;当时没有弄清楚怎么设置静态IP联网&#xff0c;现在写一篇文章。 1.首先&#xff0c;关闭ubuntu的网络&#xff1b; 2.电脑使用的是wifi,将VMware桥接到该网卡上&#xff1b; 3.在虚拟机设置里面选择桥…

vs 调试

常用&#xff1a; 调试->窗口-> 断点 监视 自动窗口 局部变量 调用堆栈 内存 反汇编&#xff08;也可以右键&#xff0c;转到反汇编&#xff09; 寄存器 快捷键&#xff1a; F5:启用调试&#xff0c;经常用来跳到下一个断点处 F9创建断点和取消断点。断点的重要作用&…

从构想到实现:EasyOne 多模态 AI 产品开发历程

在人工智能技术飞速发展的今天&#xff0c;智能产品和服务已经从单一的应用向多模态智能系统进化。随着大语言模型、计算机视觉、语音识别等领域的突破&#xff0c;开发集成多种 AI 技术的平台变得日益重要。为此&#xff0c;我们开发了 EasyOne&#xff0c;一个全新的 AI 多模…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步&#xff0c;探索运动方程&#xff0c;了解真实世界中的物理&#xff0c;并调整它们&#xff0c;以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟&#xff0c;而是找到最有趣…