rt-thread之sal+lwip的tcp客户端示例记录

示例

//
// Created by shchl on 2024/3/13.
//#include "lwip_test.h"
#include "lwip/sockets.h"
#include "netdev.h"#define DBG_ENABLE
#define DBG_TAG "lwip.tst"
#define DBG_LVL DBG_LOG#include <rtdbg.h>#define SERVER_PORT 8080
#define SERVER_HOST "192.168.199.194"
#define REC_BUF_LEN 512
#if 1static rt_thread_t mq_rec;
static struct netdev *netdev = RT_NULL;
const char *msg = "hello sever,i is client";static void socket_init(int *s) {}static void _th_entity(void *args) {struct sockaddr_in client_addr;struct sockaddr_in server_addr;int rec_len;int sockfd = -1;int result;/* 通过名称获取 netdev 网卡对象 */netdev = netdev_get_by_name(ETH_DEV_NAME);if (netdev == RT_NULL) {LOG_E("get network interface device(%s) failed.", ETH_DEV_NAME);return;}while (!(netdev->flags &= NETDEV_FLAG_LINK_UP)) {LOG_E("current netdev stat is :%d.", netdev->flags);rt_thread_mdelay(1000);}LOG_E("current netdev stat is :%d.\n", netdev->flags);/* 初始化需要绑定的客户端地址 */client_addr.sin_family = AF_INET;client_addr.sin_port = htons(8080);client_addr.sin_addr.s_addr = netdev->ip_addr.addr;rt_memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));/* 初始化预连接的服务端地址 */server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_HOST);rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));rt_uint8_t *rec_buf = rt_calloc(1, REC_BUF_LEN);while (1) {/*初始化连接*/sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {LOG_W("init socket is failed: %d;waiting 1s", sockfd);rt_thread_mdelay(1000);continue;}if (bind(sockfd, (struct sockaddr *) &client_addr, sizeof(struct sockaddr)) < 0) {LOG_W("socket bind failed.\n");goto __close_socket;}result = connect(sockfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr));if (result < 0) {LOG_W("connect is failed: %d;waiting 1s", result);goto __close_socket;}client_rec: /*接收标签*/rec_len = recv(sockfd, rec_buf, REC_BUF_LEN, 0); // 阻塞if (rec_len > 0) {LOG_I("rec data:%s", rec_buf);/*连接成功*/if (send(sockfd, msg, strlen(msg), 0) == strlen(msg)) {rt_thread_mdelay(1000);goto client_rec;} else {goto __close_socket;}} else {LOG_I("rec_len err");goto __close_socket;}__close_socket:closesocket(sockfd);rt_thread_mdelay(1000);}rt_free(rec_buf);
}int lwip_test() {mq_rec = rt_thread_create("lwip_test",_th_entity,RT_NULL,1024,15,20);if (mq_rec) {rt_thread_startup(mq_rec);}return RT_EOK;}INIT_APP_EXPORT(lwip_test);#endif

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

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

相关文章

Spring MVC HandlerMethodReturnValueHandler原理解析

在Spring MVC框架中&#xff0c;HandlerMethodReturnValueHandler是一个非常重要的组件&#xff0c;它负责处理Controller方法执行后的返回值。这个接口定义了一种机制&#xff0c;允许开发者根据不同的返回值类型&#xff0c;定制自己的返回值处理逻辑。本文将深入解析Handler…

计算机网络-第7章 网络安全(2)

7.5 密钥分配 7.6 互联网使用的安全协议 7.7 系统安全&#xff1a;防火墙与入侵检测

【故障电弧探测器 方案介绍】安科瑞电气火灾监控系统

什么是电弧&#xff1f; 电弧俗称‘电火花’ &#xff0c;又叫‘打火’ &#xff0c;本质是一种绝缘体被电压击穿后&#xff0c;由不导电变的导电&#xff0c;且发光发热的自然现象。 什么是故障电弧&#xff1f; 由于电气线路或设备中绝缘老化破损、电气连接松动、空气潮湿…

利用 AI 延长自己的编程寿命

“AIGC 将在 3 年内终结编程&#xff0c;程序员成了自己的掘墓人”程序员可能会发现自己的角色被自动化的代码生成所取代&#xff0c;他们可能会面临失业的风险&#xff0c;因为他们的技能和工作职责可能会变得过时。 你是不是也听到过这样的言论&#xff0c;甚至最近百度大佬李…

递归算法掌握

递归算法是一种自我调用的算法&#xff0c;在算法中&#xff0c;函数会调用自身来解决子问题&#xff0c;直到达到基本情况。递归算法通常将问题分解为更小的子问题&#xff0c;然后通过解决这些子问题来解决原始问题。 递归算法有以下几个特点&#xff1a; 自我调用&#xf…

SpringCloud Hystrix 断路器

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第五篇&#xff0c;即介绍 Hystrix 断路器。 二、概述 2.1 分布式系统面临的问题 复杂分布式体系结构中…

【Redis学习_常见基础命令】

Redis学习_常见基础命令 Redis学习_常见基础命令1、通用命令2、Redis 的Key的操作命令3、字符串类型的value操作命令4、哈希类型的value操作命令5、列表list类型的value操作命令6、集合类型的value操作命令7、有序集合类型的value 操作命令 Redis学习_常见基础命令 1、通用命令…

TIOBE 3月编程排行榜出炉:遥遥领先,霸榜第一!

哈喽呀~又到了每个月的语言排行榜啦&#xff01; TIOBE 3月编程语言也已经公布&#xff0c;具体有啥新变化呢&#xff1f;快和我一起往下看~ Python遥遥领先&#xff0c;霸榜第一 先来看看本月排行榜top5的表现。毫无疑问&#xff0c;Python依然遥遥领先&#xff1a; Python 第…

RabbitMQ学习笔记——消息转化器

消息转化器的问题&#xff0c;如果我们发送方发送的数据为引用类型的对象&#xff0c;默认使用的是JDK内部自带的ObjectOutputStream进行对象序列化和反序列化&#xff0c;这样做比较复杂并且不安全。 我们可以引入Jackson来做对象的序列化&#xff0c;可将默认的JDK消息转化器…

Testng认识与配置-全网最简单

总结&#xff1a;testng支持注解&#xff0c;线程池&#xff0c;数据驱动&#xff0c;参数化&#xff0c;强大执行模式&#xff0c;也支持单元测试&#xff0c;功能测试&#xff0c;接口测试 TestNG is a testing framework inspired from JUnit and NUnit but introducing som…

Antd和React使用Upload上传组件自定义上传文件(图片为例)

1.定义结构 <Uploadaccept"image/*"listType"picture-card"fileList{fileList}onChange{onChange}onPreview{onPreview}customRequest{handlePreview}>{fileList.length < 1 && " 上传封面"}</Upload> 2.内容 import t…

Samtec前沿 | 信号发生器 - 决定可靠性的重要因素之一

【摘要/前言】 作为消费者&#xff0c;我们已经开始期待我们的技术达到一个前所未有的可靠性水平。无论是智能手机还是家庭汽车&#xff0c;我们已经开始期待智能电子设备在每次使用时都能在第一时间发挥作用。 【信号和电源发生器至关重要】 现代设备能够提供如此出色的…

外包干了5天,技术明显退步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

VXLAN学习笔记

声明&#xff1a;该博客内容大部分参考参考链接整理 什么是VXLAN&#xff1f; VXLAN(Virtual Extensible LAN)即虚拟扩展局域网&#xff0c;是大二层网络中广泛使用的网络虚拟化技术。在源网络设备与目的网络设备之间建立一条逻辑VXLAN隧道&#xff0c;采用MAC in UDP的封装方…

Vue+SpringBoot打造大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

嵌入式系统中端口号的理解与分析

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…

*地宫取宝c++

题目 输入样例1&#xff1a; 2 2 2 1 2 2 1输出样例1&#xff1a; 2输入样例2&#xff1a; 2 3 2 1 2 3 2 1 5输出样例2&#xff1a; 14 思路 题目说从入口开始&#xff0c;只能向右或向下行走到达右下角&#xff0c;类似“摘花生”这道题的模型。题目又说只有当格子里的宝…

数字化浪潮下的选择:ETU-LINK光模块写码板全新升级至400G

随着光模块市场的蓬勃发展&#xff0c;ETU研发团队致力于不断改进SFP编码工具&#xff0c;以满足日益增长的客户需求。经过不懈努力&#xff0c;我们成功推出了3.0版本的写码板&#xff0c;在硬件和软件方面都进行了全面升级&#xff0c;为用户带来了极大的便利。今天&#xff…

华为鸿蒙系统接入实人认证 蚂蚁蚁盾提供技术支持

随着华为千帆计划持续推进&#xff0c;鸿蒙生态日渐完善。近日&#xff0c;华为自研的鸿蒙操作系统与蚂蚁数科、阿里云合作开发的实人认证产品完成适配。这意味着基于鸿蒙系统开发的 App 可以 0 门槛接入该实人认证产品&#xff0c;鸿蒙用户可以无感享受到和安卓、IOS 系统一样…

一文弄懂空间金字塔池化网络

目录 空间金字塔池化网络是什么&#xff1f; 组成部分和工作原理 具体步骤 ​编辑 主要优点 空间金字塔池化网络是什么&#xff1f; 空间金字塔池化网络&#xff08;Spatial Pyramid Pooling Network&#xff0c;SPPNet&#xff09;是一种用于处理具有不同尺寸和比例的输入…