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

news2024/11/19 8:52:30

示例记录

#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 1

static 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.coloradmin.cn/o/1514619.html

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

相关文章

《ElementPlus 与 ElementUI 差异集合》icon 图标使用(包含:el-button,el-input和el-dropdown 差异对比)

安装 注意 ElementPlus 的 Icon 图标 要额外安装插件 element-plus/icons-vue. npm install element-plus/icons-vue注册 全局注册 定义一个文件 element-icon.js &#xff0c;注意代码第 6 行。加上了前缀 ElIcon &#xff0c;避免组件命名重复&#xff0c;且易于理解为 e…

还是了解下吧,大语言模型调研汇总

大语言模型调研汇总 一. Basic Language ModelT5GPT-3LaMDAJurassic-1MT-NLGGopherChinchillaPaLMU-PaLMOPTLLaMABLOOMGLM-130BERNIE 3.0 Titan 二. Instruction-Finetuned Language ModelT0FLANFlan-LMBLOOMZ & mT0GPT-3.5ChatGPTGPT-4AlpacaChatGLMERNIE BotBard 自从Cha…

如何创建Gitflow图表

如何创建Gitflow图表 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储…

【关注】国内外经典大模型(ChatGPT、LLaMA、Gemini、DALL·E、Midjourney、文心一言、千问等

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Django官网项目 五

Writing your first Django app, part 5 | Django documentation | Django 自动测试介绍 何为自动测试 测试有系统自动完成。你只需要一次性的编写测试代码&#xff0c;当程序代码变更后&#xff0c;不需要对原来的测试人工再重新测试一遍。系统可以自动运行原来编写的测试代…

使用Thymeleaf-没有js的html模板导出为pdf

html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"><head><title>PDF Template</title> </head> <body> <h1>User Information</h1> <p>Name: <span th:text"${user.name}&…

干洗店管理系统洗鞋店预约上门小程序洗护流程;

干洗店洗鞋店收银管理系统&#xfe63;智能线上预约洗衣店小程序软件; 闪站侠洗衣洗鞋店收银管理系统&#xff0c;一款集进销存、收衣、收银、会员管理等实用功能于一体的洗护管理软件&#xff0c;适用于各大中小型企业个体工商户&#xff0c;功能强大&#xff0c;操作简单&…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时&#xff0c;几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法&#xff1a; 2. 错误的导入路径解决方法&#xff1a; 3. 第三方库的使用错误解决方法&#xff1a; 4. 包未正…

数据挖掘(作业4--异常值检测

异常检测方法通常可分为使用参数的方法和基于距离的方法。 1. 使用参数的异常检测方法 1.1 基础理论 使用参数的异常检测方法基于假设数据符合特定的分布&#xff08;如高斯分布、二项分布&#xff09;或模型&#xff08;如混合模型&#xff09;。这些方法通常通过对数据进行…

百度AI智能审核

一、介绍 百度内容审核平台&#xff08;Baidu Content Audit Platform&#xff09;是百度推出的一款用于进行内容审核的平台。该平台利用人工智能技术&#xff0c;对用户上传的各类内容进行审核和过滤&#xff0c;以实现内容的合规和安全&#xff0c;可以识别和过滤涉黄、涉政…

Apache SeaTunnel MongoDB CDC 使用指南

随着数据驱动决策的重要性日益凸显&#xff0c;实时数据处理成为企业竞争力的关键。SeaTunnel MongoDB CDC(Change Data Capture) 源连接器的推出&#xff0c;为开发者提供了一个高效、灵活的工具&#xff0c;以实现对 MongoDB 数据库变更的实时捕获和处理。 本文将深入探讨该连…

LeetCode——贪心算法(Java)

贪心算法 简介[简单] 455. 分发饼干[中等] 376. 摆动序列[中等] 53. 最大子数组和[中等] 122. 买卖股票的最佳时机 II[中等] 55. 跳跃游戏 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录的刷题路线。会附上一些个人的思路&#xff0c;如果有错误&#xf…

STM32输入捕获频率和占空比proteus仿真失败

这次用了两天的时间来验证这个功能&#xff0c;虽然实验没有成功&#xff0c;但是也要记录一下&#xff0c;后面能解决了&#xff0c;回来再写上解决的办法&#xff1a; 这个程序最后的实验结果是读取到的CCR1和CCR2的值都是0&#xff0c;所以没有办法算出来频率和占空比。 还…

人工智能|机器学习——BIRCH聚类算法(层次聚类)

这里再来看看另外一种常见的聚类算法BIRCH。BIRCH算法比较适合于数据量大&#xff0c;类别数K也比较多的情况。它运行速度很快&#xff0c;只需要单遍扫描数据集就能进行聚类。 1.什么是流形学习 BIRCH的全称是利用层次方法的平衡迭代规约和聚类&#xff08;Balanced Iterative…

应用程序性能监控(APM)的解决方案

随着技术的不断发展&#xff0c;APM 监控和可观测性的重要性怎么强调都不为过&#xff0c;应用程序已成为业务运营的支柱。随着组织越来越依赖数字解决方案来推动其流程并与用户互动&#xff0c;确保最佳性能和可用性变得至关重要。这超越了系统正常运行时间&#xff0c;深入研…

拼多多商品详情接口数据采集

拼多多商品详情接口数据采集是一个相对专业的任务&#xff0c;通常涉及到使用API接口或第三方采集工具等技术手段。以下是一些基本步骤和注意事项&#xff0c;供您参考&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 申请开发者账号&#xff1a;如果您打算使用API接口…

政务云安全风险分析与解决思路探讨

1.1概述 为了掌握某市政务网站的网络安全整体情况&#xff0c;在相关监管机构授权后&#xff0c;我们组织人员抽取了某市78个政务网站进行安全扫描&#xff0c;通过安全扫描&#xff0c;对该市政务网站的整体安全情况进行预估。 1.2工具扫描结果 本次利用漏洞扫描服务VSS共扫…

基于Springboot的集团门户网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的集团门户网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+纯verilog图像缩放+多路视频拼接,提供8套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融合叠加应用本方案的SDI接收GTX 8b/10b编解…

KeePass 密码库坚果云授权同步(免费)

前言介绍 KeePass是一款开源的密码管理工具&#xff0c;可以帮助你安全地存储和管理各种密码和敏感信息。 下载安装 下载KeePass&#xff1a;官网&#xff0c;下载KeePass的安装文件。根据你的操作系统选择适用的版本&#xff0c;比如Windows、macOS或Linux。 安装KeePass&a…