概述:
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_)),
...