学习open62541 --- [72] client删除subscription时的warning

2023-05-16

本文记录一个问题的理解过程,试验条件:

  • 使用open62541运行server
  • 使用asyncua运行client
  • client会向server添加subscription,然后在断开连接前删除subscription

代码和理解

server端基于open62541,

// server.c
#include "open62541.h"

#include <signal.h>
#include <stdlib.h>

UA_Boolean running = true;

static void stopHandler(int sign) {
    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
    running = false;
}

int main(void) 
{
    signal(SIGINT, stopHandler);
    signal(SIGTERM, stopHandler);

    UA_Server *server = UA_Server_new();
    UA_ServerConfig_setDefault(UA_Server_getConfig(server));

    UA_StatusCode retval = UA_Server_run(server, &running);
    
    UA_Server_delete(server);
    
    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}

Client代码是基于asyncua,

当删除subscription时,在client端会收到一个warning,
在这里插入图片描述

在open62541里对这个错误进行搜索,即UA_STATUSCODE_BADNOSUBSCRIPTION,找到相关代码,如下,

void
UA_Session_detachSubscription(UA_Server *server, UA_Session *session,
                              UA_Subscription *sub, UA_Boolean releasePublishResponses) {
    /* Detach from the session */
    sub->session = NULL;
    TAILQ_REMOVE(&session->subscriptions, sub, sessionListEntry);

    /* Reduce the count */
    UA_assert(session->subscriptionsSize > 0);
    session->subscriptionsSize--;

    /* Reduce the number of outstanding retransmissions */
    session->totalRetransmissionQueueSize -= sub->retransmissionQueueSize;
    
    /* Send remaining publish responses if the last subscription was removed */
    if(!releasePublishResponses || !TAILQ_EMPTY(&session->subscriptions))
        return;
    UA_PublishResponseEntry *pre;
    while((pre = UA_Session_dequeuePublishReq(session))) {
        UA_PublishResponse *response = &pre->response;
        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION;
        response->responseHeader.timestamp = UA_DateTime_now();
        sendResponse(server, session, session->header.channel, pre->requestId,
                     (UA_Response*)response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
        UA_PublishResponse_clear(response);
        UA_free(pre);
    }
}

具体原理如下,当client删除subscription时,会发送删除请求,server收到请求后会调用UA_Session_detachSubscription(),代码里会判断这个subscription是否是最后一个subscription,如果是那么就会把剩余的response发送出去,并把这个response的状态置为UA_STATUSCODE_BADNOSUBSCRIPTION

可以看出这个是正常的操作,本文代码里只有一个subscription,所以删除时就会把剩余的response都发出去;但是如果有多个subscription,此时只删除一个subscription就不会收到这个warning。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习open62541 --- [72] client删除subscription时的warning 的相关文章

  • 如何为 Java 创建 REST 客户端? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 通过 JSR 311 及其实现 我们拥有了通过 REST 公开 Java 对象的强大标准 然而 在客户
  • 如何减少 ssh 连接超时值[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个完整的远程主机 IP 地址列表 我编写了一个脚本来一一连接此列表中的所有主机 我的问题是 有时当 IP 地址关闭时 脚本会等待一段
  • 如何清除 html 5 客户端存储?

    例如 我认为 StackOverflow 通过 html 5 客户端存储来记住用户 我怎样才能清除这个存储 清除缓存好像不行 删除 flash cookie 似乎也没有帮助 附注我正在使用 Safari 但我也对一般内容感兴趣 StackO
  • 使用共享静态 WCF 代理客户端有哪些陷阱?

    我正在考虑将共享 读取静态 WCF 代理客户端用于高吞吐量应用程序 我相信这样做可以提高性能 但我还没有对此进行基准测试 这个想法有一些严重的缺陷吗 从我的研究中 我可以看到存在处理故障状态的问题 目前尚不清楚该状态对其他待处理请求的影响流
  • 如何在java客户端中获取HDFS服务器元数据信息?

    我需要构建一个实用程序类来测试与 HDFS 的连接 测试应显示 HDFS 的服务器端版本和任何其他元数据 虽然有很多可用的客户端演示 但没有关于提取服务器元数据的内容 有人可以帮忙吗 请注意 我的客户端是远程 java 客户端 没有 had
  • 无法连接到kafka服务器

    我尝试使用 Kafka 0 9 0 版本和端口 9092 如果我使用telnet 我成功连接到这个地址 但我无法使用 Java API 连接到 Kafka 服务器 这是我的 Java 示例 完全使用官方提供的文档 Properties pr
  • 消息正文上的 Azure 服务总线订阅筛选器

    我想根据消息的内容创建订阅 这可能吗 我试图摆脱添加自定义属性的麻烦 谢谢 这是不可能的 订阅只能根据标准 系统 和自定义 用户 属性进行过滤 如果正文 有效负载中有需要参与过滤的数据 则需要将其提升到标头
  • 有没有好的 PostgreSQL linux 客户端? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对 PostgreSQL 没有一个好的 Linux GUI 管理和开发工具感到沮丧 与仅限 Windo
  • java.sql.sqlnontransientconnectionException:java.net.connectException:连接到端口上的服务器本地主机时出错

    我一直在使用 Derbyclient 本地托管的数据库 开发一个 java 项目 我已经完成了所有事情 除了当我尝试桌面应用程序而没有手动连接到数据库 来自 Netbeans 时 标题中的错误弹出 我似乎无法解决它 感谢您花时间阅读本文并为
  • C# SSL WebSocket 客户端中有 .net 4.0 吗?

    我想知道目前是否有关于这个主题的任何内容 我找到了各种例子EG 4 5 system net websockets websocket http msdn microsoft com en us library system net web
  • Jersey 客户端 API - 身份验证

    我正在使用 Jersey 客户端 API 向 JAX WS Web 服务提交 SOAP 请求 默认情况下 Jersey 在受到质询时以某种方式使用我的 Windows Nt 凭据进行身份验证 谁能解释一下 Jersey 在代码中的位置 它可
  • NoSuchMethodError:Jersey 客户端中的 MultivaluedMap.addAll

    我正在尝试使用 Jersey Client 模拟对我的 Web 服务的 HTTP 请求 我尝试实施简单的例子 http jersey java net documentation latest user guide html d0e2365
  • 解析从请求发布中收到的多部分/表单数据

    我正在使用请求库编写 Web 服务客户端 我正在获取包含文件和文本 json 的 multipart form data 中的数据 我不知道如何解析它 是否有一个合适的库来解析 python 中的多部分 表单数据格式 或者我应该自己编写解析
  • getline 和线程的问题

    我有一个在 2 个线程上工作的客户端 一是发送数据 二是接收数据 在发送数据时我有std getline std cin string 现在 在这个线程中 我有无限循环 如果第二个线程结束或用户输入 EXIT 命令 则一切都很好 期望当第二
  • client-go:将 kubernetes json 文件解析为 k8s 结构

    我想解析 kubernetes 清单文件 json yaml 并能够将它们转换为 k8s 结构 以便稍后操作它们 我知道有 NewYAMLOrJSONDecoder Decode 函数 https github com kubernetes
  • ASP.NET Core MVC 中的客户端验证

    我在让客户端验证在 ASP NET Core MVC 中工作时遇到问题 我已经用谷歌搜索并应用了这里的示例 http www discuzfeed com code lotooslo mvc 6 client side validation
  • 从 NGINX 中客户端证书的可分辨名称获取通用名称

    我需要在 NGINX 中获取客户端证书的 CN 以将其附加到代理标头中 我已经为此找到了以下地图代码 map ssl client s dn ssl client s dn cn default CN
  • SQL Server中检测客户端断开连接

    当客户端与 SQL Server 连接时 来自客户端 被切割 如何检测 SQL Server 2008 或 2012 中的这种断开连接 我可以解决这个问题吗服务器触发器 您可以创建一个事件通知 http technet microsoft
  • 如何在角度中对取消订阅功能进行单元测试

    我想找到一种方法来测试订阅和主题上的取消订阅函数调用 我想出了一些可能的解决方案 但每一种都有优点和缺点 请记住 我不想出于测试目的而更改变量的访问修饰符 通过反射访问组件的私有变量 在这种情况下 我有一个存储订阅的私有类变量 组件 ts
  • Jersey Rest 客户端未添加查询参数

    我正在尝试为 google 搜索 api 制作一个简单的球衣休息客户端 Client client ClientBuilder newClient WebTarget target client target https www googl

随机推荐

  • 代理模式与委托模式的异同点

    在 设计模式之禅 xff08 第二版 xff09 中 xff0c 作者说 代理模式也叫做委托模式 xff0c 显然是认为代理模式和委托模式是毫无差别的 然而在实际开发中 xff0c 我们通常可以很明确的知道一个模式究竟是代理模式还是委托模式
  • TCP/IP编程之select函数详解

    前述 xff1a linux下的I O复用模型目前很多都已经不用select函数了 xff0c 而是用epoll xff0c 但是为什么还需要了解select编程呢 xff0c 其实是从两个方面考虑的 xff1a 一是为了通过select去
  • 堆栈的详细解释

    一 在c中分为这几个存储区 1 栈 由编译器自动分配释放 2 堆 一般由程序员分配释放 xff0c 若程序员不释放 xff0c 程序结束时可能由OS回收 3 全局区 xff08 静态区 xff09 xff0c 全局变量和静态变量的存储是放在
  • Gmapping、hector、Cartographer三种激光SLAM算法简单对比

    文章目录 一 Gmapping是基于粒子滤波的算法 二 Hector SLAM三 Cartographer 一 Gmapping是基于粒子滤波的算法 缺点 xff1a 严重依赖里程计 xff0c 无法适应无人机及地面不平坦的区域 xff0c
  • TCP连接建立过程

    TCP连接建立过程 浏览器访问网站 xff0c 通过域名解析找到ip地址后会与服务器端建立连接 其中TCP xff08 Transmission Control Protocol xff0c 传输控制协议 xff09 是一种面向连接的 可靠
  • 海康威视错误代码文档大全【完整版】

    简介 本文收录了海康各大设备错误码 xff0c 按ctrl 43 f查询 xff1b 包含网络通讯库错误码 阵列错误码 安全激活相关错误码 智能设备错误码 RTSP通讯库错误码 软解码库错误码 转封装库错误码 语音对讲库错误码 Qos流控库
  • lighttpd http响应报文(Response)增加安全头Referrer-Policy和X-Permitted-Cross-Domain-Policies方法

    X Permitted Cross Domain Policies和Referrer Policy说明 X Permitted Cross Domain Policies X Permitted Cross Domain Policies
  • ROS使用ARUCO识别二维码获取位置信息做定位使用

    使用ARUCO识别二维码获取位置信息 1 安装软件 cd catkin ws src git clone b kinetic devel https github com pal robotics aruco ros cd catkin m
  • Keil 编译时无法找到头文件解决

    Keil 编译时无法找到头文件解决方法 1 背景 Keil 编译的时候无法找到头文件 xff0c 搜了下相关问题及解决方法 xff0c 有介绍说是因为文件夹中有数字 xff0c 无法搜到头文件 xff0c 进行了更改 xff0c 还是找不到
  • 学习open62541 --- [71] Alarm and Condition

    本文讲述Alarm and Condition的用法 xff0c 主要以源码里提供的例子为基础进行讲解和演示 xff0c 即tutorial server alarms conditions c xff0c 该例子写的有点乱 xff0c 本
  • 学习open62541 ---[68] 使用Wireshark观察通信消息

    Wireshark是强大的网络协议分析工具 xff0c 而open62541也是基于socket的 xff0c 所以也可以用其来观察OPCUA通信消息 一 安装Wireshark 去https www wireshark org 去下载并安
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同
  • 学习open62541 --- [69] Client监测多个变量值

    有读者问Client如何监测多个变量值 xff0c 这篇文章给了提示 xff0c 但是没给例子 xff0c 本文给出详细例子 xff0c 使用的open62541版本是1 3 3 xff0c 运行环境debian10 5 一 准备Serve
  • 学习CANopen --- [6] 自定义对象字典

    在前面几篇文章中 xff0c 我们运行例子时都需要一个eds文件 xff0c 比较麻烦 xff0c 本文讲述如何在代码中自定义对象字典 xff0c 只添加自己需要的OD项 如果是作为master来使用 xff0c 还是比较方便的 自定义对象
  • 学习CANopen --- [7] 使用块(Block)下载

    对于一次传输超过4字节的情形 xff0c SDO可以使用Segment传输或者Block传输 xff0c Segment传输在第6篇文章中已经介绍 xff0c 本文讲解Block传输中的下载情况 一 与Segment传输的比较 相比于Seg
  • 学习open62541 --- [70] 深入理解变量监测

    本文深入探讨一下变量监测的用法和原理 一 累积传输 先前写的关于变量监测的文章 xff0c 都是设置一个采样时间 xff0c 然后有变化了就通知一下 xff0c 有时我们希望变化累积一段时间再一起传给client xff0c 这时如何设置呢
  • 学习CANopen --- [8] 多主机同时运行时的问题

    本文记录一下实际使用CANopen时开启多个主机遇到的问题 一 问题描述 本人在嵌入式设备上用Python CANopen库写一个SDO xff0c 由于数据比较多 xff0c 就使用了Segment download xff0c 大概需要
  • 学习CANopen --- [9] CAN总线的状态检查

    本文讲述如何判断CAN总线是否存在以及是否bus off xff0c 以vcan0进行讲解 xff0c vcan0是虚拟的CAN接口 xff0c 可以把它看做一个软件CAN适配器 xff08 区别于硬件CAN适配器 xff0c 如PeakC
  • 学习CANopen --- [10] 汽车外接OBD模块原理

    在某宝上搜索汽车OBD xff0c 可以发现很多卖OBD模块的 xff0c 通过接入OBD模块可以增加车子本身没有的功能 xff0c 如锁车升窗 xff0c 行车自动落锁和后视镜折叠等 xff0c 那么其实现原理是什么呢 xff1f 使用时
  • 学习open62541 --- [72] client删除subscription时的warning

    本文记录一个问题的理解过程 xff0c 试验条件 xff1a 使用open62541运行server使用asyncua运行clientclient会向server添加subscription xff0c 然后在断开连接前删除subscrip