Skip to content
Snippets Groups Projects
Commit 6b78a4ca authored by Adrien Béraud's avatar Adrien Béraud
Browse files

peerdiscovery: catch parsing errors

parent 66d3a8ae
Branches
Tags
No related merge requests found
...@@ -116,7 +116,7 @@ private: ...@@ -116,7 +116,7 @@ private:
/** /**
* Receive messages * Receive messages
*/ */
std::pair<SockAddr, Blob> recvFrom(); std::pair<SockAddr, msgpack::object_handle> recvFrom();
/** /**
* Listener pack thread loop * Listener pack thread loop
...@@ -261,27 +261,23 @@ PeerDiscovery::DomainPeerDiscovery::startDiscovery(const std::string &type, Serv ...@@ -261,27 +261,23 @@ PeerDiscovery::DomainPeerDiscovery::startDiscovery(const std::string &type, Serv
} }
} }
std::pair<SockAddr, Blob> std::pair<SockAddr, msgpack::object_handle>
PeerDiscovery::DomainPeerDiscovery::recvFrom() PeerDiscovery::DomainPeerDiscovery::recvFrom()
{ {
sockaddr_storage storeage_recv; sockaddr_storage sa;
socklen_t sa_len = sizeof(storeage_recv); socklen_t sa_len = sizeof(sa);
std::array<uint8_t, 64 * 1024> recv;
std::array<uint8_t, 64 * 1024> buf;
ssize_t nbytes = recvfrom( ssize_t nbytes = recvfrom(
sockfd_, sockfd_,
recv.data(), (char*)buf.data(), buf.size(),
recv.size(),
0, 0,
(sockaddr*)&storeage_recv, (sockaddr*)&sa, &sa_len
&sa_len
); );
if (nbytes < 0) { if (nbytes < 0)
throw std::runtime_error(std::string("Error receiving packet: ") + strerror(errno)); throw std::runtime_error(std::string("Error receiving packet: ") + strerror(errno));
}
SockAddr ret {storeage_recv, sa_len}; return { SockAddr { sa, sa_len }, msgpack::unpack(reinterpret_cast<char*>(buf.data()), nbytes) };
return {ret, Blob(recv.begin(), recv.begin()+nbytes+1)};
} }
void void
...@@ -304,7 +300,8 @@ PeerDiscovery::DomainPeerDiscovery::listenerpack_thread() ...@@ -304,7 +300,8 @@ PeerDiscovery::DomainPeerDiscovery::listenerpack_thread()
FD_SET(stop_readfd, &readfds); FD_SET(stop_readfd, &readfds);
FD_SET(sockfd_, &readfds); FD_SET(sockfd_, &readfds);
int data_coming = select(sockfd_ > stop_readfd ? sockfd_ + 1 : stop_readfd + 1, &readfds, nullptr, nullptr, nullptr);
int data_coming = select(std::max(sockfd_, stop_readfd) + 1, &readfds, nullptr, nullptr, nullptr);
{ {
std::unique_lock<std::mutex> lck(dmtx_); std::unique_lock<std::mutex> lck(dmtx_);
...@@ -317,17 +314,15 @@ PeerDiscovery::DomainPeerDiscovery::listenerpack_thread() ...@@ -317,17 +314,15 @@ PeerDiscovery::DomainPeerDiscovery::listenerpack_thread()
perror("Select Error"); perror("Select Error");
std::this_thread::sleep_for( std::chrono::seconds(1) ); std::this_thread::sleep_for( std::chrono::seconds(1) );
} }
} } else if (data_coming > 0) {
if (data_coming > 0) {
if (FD_ISSET(stop_readfd, &readfds)) { if (FD_ISSET(stop_readfd, &readfds)) {
std::array<uint8_t, 64 * 1024> buf; std::array<uint8_t, 64 * 1024> buf;
recv(stop_readfd, (char*)buf.data(), buf.size(), 0); recv(stop_readfd, (char*)buf.data(), buf.size(), 0);
} }
try {
auto rcv = recvFrom(); auto rcv = recvFrom();
msgpack::object_handle oh = msgpack::unpack(reinterpret_cast<char*>(rcv.second.data()), rcv.second.size()); msgpack::object obj = rcv.second.get();
msgpack::object obj = oh.get();
if (obj.type != msgpack::type::MAP) if (obj.type != msgpack::type::MAP)
continue; continue;
...@@ -336,12 +331,15 @@ PeerDiscovery::DomainPeerDiscovery::listenerpack_thread() ...@@ -336,12 +331,15 @@ PeerDiscovery::DomainPeerDiscovery::listenerpack_thread()
if (o.key.type != msgpack::type::STR) if (o.key.type != msgpack::type::STR)
continue; continue;
auto key = o.key.as<std::string>(); auto key = o.key.as<std::string>();
std::unique_lock<std::mutex> lck(dmtx_); std::lock_guard<std::mutex> lck(dmtx_);
auto callback = callbackmap_.find(key); auto callback = callbackmap_.find(key);
if (callback != callbackmap_.end()){ if (callback != callbackmap_.end()){
callback->second(std::move(o.val), std::move(rcv.first)); callback->second(std::move(o.val), std::move(rcv.first));
} }
} }
} catch (const std::exception& e) {
std::cerr << "Error receiving packet: " << e.what() << std::endl;
}
} }
} }
if (stop_readfd != -1) if (stop_readfd != -1)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment