rt-thread之sal+lwip的tcp客户端示例记录(接收非阻塞)

示例记录

#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 _th_entity(void *args) {struct sockaddr_in client_addr;struct sockaddr_in server_addr;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->ip_addr.addr == 0 || netdev->gw.addr == 0) {LOG_W("current netdev stat is :%d.", netdev->flags);rt_thread_mdelay(1000);}LOG_I("current netdev ip addr :%s.", inet_ntoa(netdev->ip_addr));/* 初始化需要绑定的客户端地址 */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;}/*配置成非阻塞模式*/int val = 1;ioctlsocket(sockfd, FIONBIO, &val);client_rec: /*接收标签*/result = recv(sockfd, rec_buf, REC_BUF_LEN, 0);if (result == 0) { /*表示连接关闭*/LOG_I("server(%s) reject connected or closed", SERVER_HOST);goto __close_socket;} else if (result == -1) { /*表示未接收到数据*/rt_thread_mdelay(10);goto client_rec;} else if (result > 0) {/*连接成功*/if (send(sockfd, msg, strlen(msg), 0) == strlen(msg)) {goto client_rec;} else {goto __close_socket;}} else {/*todo 逻辑上不会执行到此处*/LOG_E("unknown result: %d", result);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.hqwc.cn/news/537787.html

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

相关文章

1、计划任务介绍

Windows计划任务介绍 1、含义&#xff1a; 简单点就是定时执行任务。 在许多场景下&#xff0c;我们定时执行一些任务。比如&#xff1a;定时拉取、备份文件&#xff0c;更新代码等等操作。 WinR打开运行框&#xff0c;输入&#xff1a;control schedtasks&#xff0c;就会…

LLM和自动驾驶强强联合 | DriveDreamer-2:自动驾驶定制视频生成世界模型!

文章链接&#xff1a;https://arxiv.org/pdf/2403.06845.pdf 项目文档&#xff1a;https://drivedreamer2.github.io/ 自动驾驶是最近几年非常火热的方向&#xff0c;那LLM和视频生成在自动驾驶领域有哪些应用呢&#xff1f;今天和大家一起学习一下最新的一篇工作————Driv…

多线程相关

JMM&#xff08;内存模型&#xff09; JMM三个特性&#xff1a; 原子性 一个或者多个操作在CPU执行的过程中不被中断的特性&#xff0c;要么全部成功&#xff0c;要么全部失败可见性 一个线程修改了共享变量的值后&#xff0c;其他线程能够立即看到这个修改有序性 程序执行的…

武汉LUG报名开启!这次我们来到了华中科技大学,3月23日(周六)来见面吧!

内容来源&#xff1a;deepin 社区 LUG 不间断&#xff0c;精彩不停歇&#xff0c;经过一个月的修整&#xff0c;2024年3月23日下午&#xff0c;我们将在华中科技大学东校区举办 3月 WHLUG&#xff0c;欢迎大家来到现场&#xff0c;和我们一起交流技术&#xff0c;分享自己学习过…

惊艳到了,每个开发人员都必须要知道的6个HTML属性!

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 说起 HTML 很多同学都会认为&#xff0c;这不就是小菜一碟吗&#xff…

大型污水处理站运维公司怎么选择

大型污水处理站运维公司的选择是关乎环境保护和城市发展的重要决策。在如今污水治理领域日益重要的背景下&#xff0c;选择一家专业的运维公司对于确保污水处理站的高效运行、提高处理效果和保护环境具有关键意义。那么&#xff0c;我们应该如何选择适合自己的大型污水处理站运…

Css基础——精灵图(sprites)和字体图标

1、精灵图 1.1、精灵图的由来 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减…

腾讯云服务器地域是什么?地域选择看着一篇就够了

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)

任务一&#xff1a;用户登录 登录系统通常分为普通用户与管理员权限&#xff0c;在用户登录系统时&#xff0c;可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序&#xff0c;该程序分为管理员用户与普通用户&#xff0c;其中管理员账号密码在程序中设定&#…

亚太大带宽服务器怎么设置

亚太大带宽服务器怎么设置&#xff0c;要设置亚太大带宽服务器&#xff0c;您需要考虑以下几个关键步骤&#xff0c;RAK部落小编为您整理发布亚太大带宽服务器怎么设置的具体步骤。 1. 选择合适的服务提供商&#xff1a;您需要选择一个提供亚太地区大带宽服务器的服务提供商。2…

靶向性叶酸-壳聚糖 FA-Chitosan 靶向纳米药物递送材料

产品简称&#xff1a;Chitosan-FA/ FA-Chitosan/CS-FA /FA-CS/Chitosan-Folate/ Folate-Chitosan/CS-Folate /Folate-CS 产品中文名称&#xff1a;壳聚糖-叶酸 / 叶酸-壳聚糖 分子量&#xff1a;可以根据要求定制 保存条件&#xff1a; -20干燥保存 有效期&#xff1a; 一年…

西门子PLC常用底层逻辑块分享_单/双输出电机

文章目录 前言一、功能概述二、单输出电机程序编写1.创建自定义数据类型2.创建FB功能块“单输出电机”3.编写程序 三、双输出电机程序编写1.创建自定义数据类型2.创建FB功能块“双输出电机”3.编写程序 前言 本文分享一个自己编写的电机控制逻辑块。 一、功能概述 手动状态、…