summaryrefslogtreecommitdiff
path: root/implementation/endpoints/src/udp_client_endpoint_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/endpoints/src/udp_client_endpoint_impl.cpp')
-rw-r--r--implementation/endpoints/src/udp_client_endpoint_impl.cpp101
1 files changed, 35 insertions, 66 deletions
diff --git a/implementation/endpoints/src/udp_client_endpoint_impl.cpp b/implementation/endpoints/src/udp_client_endpoint_impl.cpp
index 95f12c3..a5a90cc 100644
--- a/implementation/endpoints/src/udp_client_endpoint_impl.cpp
+++ b/implementation/endpoints/src/udp_client_endpoint_impl.cpp
@@ -8,10 +8,9 @@
#include <boost/asio/ip/multicast.hpp>
-#include <vsomeip/logger.hpp>
-
#include "../include/endpoint_host.hpp"
#include "../include/udp_client_endpoint_impl.hpp"
+#include "../../logging/include/logger.hpp"
#include "../../utility/include/utility.hpp"
namespace vsomeip {
@@ -19,7 +18,9 @@ namespace vsomeip {
udp_client_endpoint_impl::udp_client_endpoint_impl(
std::shared_ptr< endpoint_host > _host, endpoint_type _remote,
boost::asio::io_service &_io)
- : udp_client_endpoint_base_impl(_host, _remote, _io) {
+ : udp_client_endpoint_base_impl(_host, _remote, _io, VSOMEIP_MAX_UDP_MESSAGE_SIZE),
+ recv_buffer_(VSOMEIP_MAX_UDP_MESSAGE_SIZE, 0),
+ recv_buffer_size_(0) {
}
udp_client_endpoint_impl::~udp_client_endpoint_impl() {
@@ -43,44 +44,44 @@ void udp_client_endpoint_impl::connect() {
void udp_client_endpoint_impl::start() {
socket_.open(remote_.protocol());
connect();
- receive();
}
-void udp_client_endpoint_impl::send_queued(message_buffer_ptr_t _buffer) {
+void udp_client_endpoint_impl::send_queued() {
+ message_buffer_ptr_t its_buffer = queue_.front();
#if 0
std::stringstream msg;
msg << "ucei<" << remote_.address() << ":"
<< std::dec << remote_.port() << ">::sq: ";
- for (std::size_t i = 0; i < _buffer->size(); i++)
+ for (std::size_t i = 0; i < its_buffer->size(); i++)
msg << std::hex << std::setw(2) << std::setfill('0')
- << (int)(*_buffer)[i] << " ";
+ << (int)(*its_buffer)[i] << " ";
VSOMEIP_DEBUG << msg.str();
#endif
socket_.async_send(
- boost::asio::buffer(*_buffer),
+ boost::asio::buffer(*its_buffer),
std::bind(
&udp_client_endpoint_base_impl::send_cbk,
shared_from_this(),
- _buffer,
std::placeholders::_1,
std::placeholders::_2
)
);
- receive();
}
void udp_client_endpoint_impl::receive() {
- packet_buffer_ptr_t its_buffer
- = std::make_shared< packet_buffer_t >();
+ if (recv_buffer_size_ == max_message_size_) {
+ // Overrun -> Reset buffer
+ recv_buffer_size_ = 0;
+ }
+ size_t buffer_size = max_message_size_ - recv_buffer_size_;
socket_.async_receive_from(
- boost::asio::buffer(*its_buffer),
+ boost::asio::buffer(&recv_buffer_[recv_buffer_size_], buffer_size),
remote_,
std::bind(
&udp_client_endpoint_impl::receive_cbk,
std::dynamic_pointer_cast<
udp_client_endpoint_impl
>(shared_from_this()),
- its_buffer,
std::placeholders::_1,
std::placeholders::_2
)
@@ -101,69 +102,37 @@ unsigned short udp_client_endpoint_impl::get_remote_port() const {
return socket_.remote_endpoint().port();
}
-void udp_client_endpoint_impl::join(const std::string &_address) {
-
- if (remote_.address().is_v4()) {
- try {
- socket_.set_option(
- boost::asio::ip::udp::socket::reuse_address(true));
- socket_.set_option(boost::asio::ip::multicast::join_group(
- boost::asio::ip::address::from_string(_address)));
- }
- catch (...) {
- }
- } else {
- // TODO: support multicast for IPv6
- }
-}
-
-void udp_client_endpoint_impl::leave(const std::string &_address) {
- if (remote_.address().is_v4()) {
- try {
- socket_.set_option(
- boost::asio::ip::udp::socket::reuse_address(true));
- socket_.set_option(boost::asio::ip::multicast::leave_group(
- boost::asio::ip::address::from_string(_address)));
- }
- catch (...) {
- }
- } else {
- // TODO: support multicast for IPv6
- }
-}
-
void udp_client_endpoint_impl::receive_cbk(
- packet_buffer_ptr_t _buffer,
boost::system::error_code const &_error, std::size_t _bytes) {
std::shared_ptr<endpoint_host> its_host = host_.lock();
if (!_error && 0 < _bytes && its_host) {
#if 0
std::stringstream msg;
msg << "ucei::rcb(" << _error.message() << "): ";
- for (std::size_t i = 0; i < _bytes; ++i)
+ for (std::size_t i = 0; i < _bytes + recv_buffer_size_; ++i)
msg << std::hex << std::setw(2) << std::setfill('0')
- << (int)(*_buffer)[i] << " ";
+ << (int) recv_buffer_[i] << " ";
VSOMEIP_DEBUG << msg.str();
#endif
- this->message_.insert(this->message_.end(), _buffer->begin(),
- _buffer->begin() + _bytes);
-
- bool has_full_message;
- do {
- uint32_t current_message_size
- = utility::get_message_size(this->message_);
-
- has_full_message = (current_message_size > 0
- && current_message_size <= this->message_.size());
- if (has_full_message) {
- its_host->on_message(&message_[0], current_message_size, this);
- this->message_.erase(this->message_.begin(),
- this->message_.begin() + current_message_size);
- }
- } while (has_full_message);
+ recv_buffer_size_ += _bytes;
+ uint32_t current_message_size
+ = utility::get_message_size(&this->recv_buffer_[0],
+ (uint32_t) recv_buffer_size_);
+ if (current_message_size > VSOMEIP_SOMEIP_HEADER_SIZE &&
+ current_message_size <= _bytes) {
+ its_host->on_message(&recv_buffer_[0], current_message_size, this);
+ } else {
+ VSOMEIP_ERROR << "Received a unreliable vSomeIP message with bad length field";
+ }
+ recv_buffer_size_ = 0;
+ }
+ if (!_error) {
+ receive();
+ } else {
+ if (socket_.is_open()) {
+ receive();
+ }
}
-
- receive();
}
} // namespace vsomeip