vsomeip用到的socket

news2024/11/22 10:59:51

概述:

​ vsomeip用到的socket的代码全部都在implementation\endpoints目录下面,主要分布在下面六个endpoint类中:

local_client_endpoint_impl  // 本地客户端socket(UDS Socket或者127.0.0.1的socket)

local_server_endpoint_impl  // 本地服务端socket

tcp_client_endpoint_impl     // tcp客户端socket

tcp_server_endpoint_impl   // tcp服务端socket

udp_client_endpoint_impl  // udp客户端socket

udp_server_endpoint_impl   // udp服务端socket

endpoint

​ endpoint类是上面提到的各种endpoint的父类,其定义了endpoint的接口

class endpoint {
public:
    // 主要接口如下,略去了一部分接口
    virtual void start() = 0;
    virtual void stop() = 0;
    virtual bool send(const byte_t *_data, uint32_t _size) = 0;
    virtual bool send_to(const std::shared_ptr<endpoint_definition> _target,
            const byte_t *_data, uint32_t _size) = 0;
    virtual void receive() = 0;
    virtual bool is_reliable() const = 0;
    virtual bool is_local() const = 0;
    virtual void restart(bool _force = false) = 0;
    virtual void register_error_handler(error_handler_t _error) = 0;
};

​ 从endpoint类派生成client_endpoint以及server_endpoint类,分别用于定义客户端socket以及服务端socket的接口

class client_endpoint : public virtual endpoint {
public:
    virtual ~client_endpoint() {}

    virtual bool get_remote_address(boost::asio::ip::address &_address) const = 0;
    virtual std::uint16_t get_remote_port() const = 0;
};
class server_endpoint_impl: public endpoint_impl<Protocol>,
        public std::enable_shared_from_this<server_endpoint_impl<Protocol> > {
public:
    // 主要接口如下,略去了一部分接口
    void restart(bool _force);
    bool is_established() const;
    bool send(const uint8_t *_data, uint32_t _size);
    virtual void stop();
	void connect_cbk(boost::system::error_code const &_error);  
    void send_cbk(const queue_iterator_type _queue_iterator,
                  boost::system::error_code const &_error, std::size_t _bytes);
    void flush_cbk(endpoint_type _target,
                   const std::shared_ptr<train>& _train,
                   const boost::system::error_code &_error_code);
};

​ 最后,从client_endpoint以及server_endpoint类,根据实际通信的方式(tcp/udp/local),派生出总共六种具体的endpoint类(local_client_endpoint,local_server_endpoint,tcp_client_endpoint,tcp_server_endpoint,udp_client_endpoint,udp_server_endpoint),每一种具体的endpoint类中根据协议的不同使用boost的asio创建对应的socket,完成通信功能。

在这里插入图片描述

endpoint_manager

​ endpoint_manager用于管理各种endpoint,包括创建,删除,查询等常见操作。endpoint_manager的类结构如下图:
在这里插入图片描述

​ endpoint_host是一个接口,表示endpoint的容器应该实现那些接口函数,这些接口用于让外界获取容器内的endpoint的状态变化(endpoint连接成功,发生错误,断开连接等),也可以获取某个endpoint属于哪个vsomeip应用(获取clientid),释放某个endpoint占用的端口(只针对非local类型的endpoint)。

​ 从endpoint_manage_base的接口可以看出其主要负责管理local_endpoint,包括创建local_client_endpoint(create_local_unlocked接口内实现),创建local_server_endpoint(create_local接口实现)等。

​ local_endpoint主要用于在同一主机内的不同someip应用间通信,也包括someip应用和routingmanager的通信的,这些都是依赖local_endpoint的。

​ 对于windows系统平台,local_endpoint是通过tcp传输类型的socket实现的,其他平台是通过boost::asio::local::stream_protocol_ext::endpoint来实现的。

​ endpoint_manager_impl则是负责管理费local_endpoint类型的其他endpoint(tcp/udp),同时,如果开启了SOMEIP的SD功能(ServiceDiscovery),则需要依赖组播通信,此时还会涉及到multicast_endpoint的管理。这些都是由endpoint_manager_impl来实现的。

使用场景

创建manager:

endpoint_manager_base:

​ 对于someip应用来说,如果其没有承担routingmanager的角色,那么也就不需要和其他主机上的someip应用以及其他主机上的routingmanager直接打交道,可以只依赖local_endpoint就完成功能(和其主机的通信交给routingmanager来完成)

​ 因此,这些someip应用只需要routingmanagerproxy既可(因为不是routingmanager应用,不需要创建routingmanagerimpl),而endpoint_manager_base的实例也就在routingmanagerproxy中创建,主要负责和同主机内的其他someip应用以及routingmanager应用通信。

void routing_manager_proxy::init() {
    routing_manager_base::init(std::make_shared<endpoint_manager_base>(this, io_, configuration_));
    {
        std::lock_guard<std::mutex> its_lock(sender_mutex_);
        sender_ = ep_mgr_->create_local(VSOMEIP_ROUTING_CLIENT);
    }
}
endpoint_manager_impl:

​ 对于承担了routingmanager功能的someip应用,其需要承担和其他主机的通信,因此需要依赖endpoint_manager_impl创建和管理各个TCP/UDP类型的endpoint。

routing_manager_impl::routing_manager_impl(routing_manager_host *_host) :
        routing_manager_base(_host),
        ...
        ep_mgr_impl_(std::make_shared<endpoint_manager_impl>(this, io_, configuration_)),
        ...

创建endpoint:

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

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

相关文章

深入挖掘C++中的特性之一 — 继承

目录 1.继承的概念 2.举个继承的例子 3.继承基类成员访问方式的变化 1.父类成员的访问限定符对在子类中访问父类成员的影响 2.父类成员的访问限定符子类的继承方式对在两个类外访问子类中父类成员的影响 4.继承类模版&#xff08;注意事项&#xff09; 5.父类与子类间的转…

FTP服务原理及使用

一、配置FTP服务 配置FTP服务&#xff0c;内容不难&#xff0c;本地虚拟机上自带FTP服务程序&#xff0c;自己下载即可。 二、理解FTP的主动模式和被动模式原理 1 主动模式 客户端先开启一个大于1024的随机端口&#xff0c;用来与服务器的21号端口建立控制连接&#xff1b;当…

rabbitmq消费者应答模式

1.应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。 自动应答&#xff1a; 不在乎消费者对消息处理是否成功&#xff0c;都会告诉队列删…

win11远程连接MySQL(linux版),不需安装docker容器

不想安装虚拟机&#xff0c;想在Windows 11上运行Linux。 在win11的搜索框内&#xff0c;搜索"启用或关闭"&#xff0c;出现了“启用或关闭Windows功能”&#xff0c;双击打开。 勾选"适用于Linux的Windows子系统"&#xff0c;“虚拟机平台”&#xff0c…

网站可疑问题

目标站点 Google hack 页面访问 抓包 POST /admin.php?actionlogin HTTP/2 Host: www.xjy.edu.cn Cookie: xkm_sidA6x4Cgw2zx User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0 Accept: text/html,application/xhtmlxml,appl…

AtCoder ABC373 A-D题解

ABC372 的题解没写是因为 D 是单调栈我不会(⊙︿⊙) 比赛链接:ABC373 总结&#xff1a;wssb。听说 E 很水&#xff1f;有时间我看看。 Problem A: Code #include <bits/stdc.h> using namespace std; int mian(){int ans0;for(int i1;i<12;i){string S;cin>&g…

7c结构体

文章目录 一、结构体的设计二、结构体变量的初始化2.1结构体在内存表示&#xff1b;**2.2**结构体类型声明和 结构体变量的定义和初始化只声明结构体类型声明类型的同时定义变量p1用已有结构体类型定义结构体变量p2*定义变量的同时赋初值。*匿名声明结构体类型 2.3 结构体嵌套及…

【笔记】选择题笔记408

无向图有16条边&#xff0c;其中度为4的顶点个数为3&#xff0c;度为3的顶点个数为4&#xff0c;其他顶点的度均小于3。图G所含的顶点个数至少是&#xff1a;11 总度数16232 度为2的顶点个数为x&#xff0c;度为1的顶点个数为y&#xff0c;度为0的顶点个数为z 由此可列出三元一…

工程机械车辆挖掘机自卸卡车轮式装载机检测数据集VOC+YOLO格式2644张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2644 标注数量(xml文件个数)&#xff1a;2644 标注数量(txt文件个数)&#xff1a;2644 标注…

从零开始Hadoop集群环境搭建

目录 1. Centos7.5硬件配置1.1 创建虚拟机1.2 虚拟机系统设置 2. IP地址和主机名称配置3. 软件配置3.1 安装 epel-release3.2 卸载虚拟机自带的JDK3.3 克隆虚拟机3.4 修改克隆虚拟机的IP3.5 JDK安装3.6 Hadoop安装 4. Hadoop目录结构 1. Centos7.5硬件配置 1.1 创建虚拟机 1.2…

CMU 10423 Generative AI:lec18(大模型的分布式训练)

这个文档主要讲解了分布式训练&#xff08;Distributed Training&#xff09;&#xff0c;特别是如何在多GPU上训练大规模的语言模型。以下是主要内容的概述&#xff1a; 1. 问题背景 训练大规模语言模型的主要挑战是内存消耗。 训练过程中&#xff0c;内存消耗主要来源于两个…

关于Mac管理员root权限的一些问题总结

&#x1f389; 前言 最近在学习Vue CLI的时候&#xff0c;发现在Vscode里面想要修改文件或者保存文件都会显示“permission denied”&#xff0c;即权限不足。于是想了一些解决方法&#xff0c;记录在此。 &#x1f389; 检查当前用户权限 打开终端&#xff0c;输入以下指令…

yolov8/9/10/11模型在工地安全帽检测中的应用【代码+数据集+python环境+GUI系统】

yolov8/9/10/11模型在工地安全帽检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10/11模型在工地安全帽检测中的应用【代码数据集python环境GUI系统】 背景意义 在建筑工地、矿山、工厂等工业生产环境中&#xff0c;安全帽是保护工人头部免受伤害的重要劳保工具。然而…

销售业绩飞跃,通过CRM系统激发销售团队潜力

要让销售人员使用CRM系统&#xff0c;首先需要理解他们抗拒的原因。常见的抗拒理由包括时间不足、系统复杂、缺乏培训以及对成效的怀疑。为了克服这些障碍&#xff0c;企业可以采取一系列措施&#xff0c;如提供全面培训、通过案例展示价值、强调实际收益、逐步引入系统、领导层…

C语言第15课—数据在内存中的存储

文章目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断3. 整数存储练习3.1 练习13.2 练习23.3 练习33.4 练习43.5 练习5 4. 浮点数在内存中的存储4.1 浮点数存的过程4.2 浮点数取的过程 1. 整数在内存中的存储 整数的2进制表示有三种方法&#xff1a;原码、反码、补码有符…

CSS3--美若天仙!?

免责声明&#xff1a;本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …

37 预处理器与预处理指令、宏定义(定义常量、数据类型、替换文本、嵌套与取消)、带参宏(细节处理、与函数的区别)

目录 1 预处理器 2 预处理指令 2.1 位置 2.2 格式 2.3 换行 2.4 结束符 2.5 位置限制 3 宏定义 3.1 语法格式 3.2 使用宏定义常量 3.3 使用宏定义数据类型 3.4 宏定义的替换文本 3.5 宏定义嵌套 3.6 取消宏定义 4 带参数的宏定义 4.1 语法格式 4.2 案例演示 …

ElasticSearch学习笔记(三)Ubuntu 2204 server elasticsearch集群配置

如果你只是学习elasticsearch的增、删、改、查等相关操作&#xff0c;那么在windows上安装一个ES就可以了。但是你如果想在你的生产环境中使用Elasticsearch提供的强大的功能&#xff0c;那么还是建议你使用Linux操作系统。 本文以在Ubuntu 2204 server中安装elasticsearch 8.…

go的一些知识点

一.package 1.新建项目 新建一个itying文件夹&#xff0c;在里面使用命令 就能生成一个go项目。生成一个go.mod 2.调用别的包的代码 按照下面的目录层级生成代码 //clac.go package calcfunc Add(x, y int) int {return x y } func Sub(x, y int) int {return x - y }…

【Web】复现n00bzCTF2024 web题解(全)

目录 File Sharing Portal 方法一&#xff1a; 方法二&#xff1a; Focus-on-yourSELF Passwordless File Sharing Portal 附件的Dockerfile给了这么一段 # Add the cron job to the crontab RUN mkdir /etc/cron.custom RUN echo "*/5 * * * * root rm -rf /app…