9#include "../AsyncSocketBase.hxx"
10#include "../ReTurnSubsystem.hxx"
14#ifdef BOOST_ASIO_HAS_STD_CHRONO
15using namespace std::chrono;
18using namespace std::chrono;
25#define RESIPROCATE_SUBSYSTEM ReTurnSubsystem::RETURN
33 asio::ip::address address = asio::ip::make_address(localAddress.
c_str());
34 asio::error_code errorCode;
35 mSocket.open(address.is_v6() ? asio::ip::udp::v6() : asio::ip::udp::v4(), errorCode);
39 mSocket.bind(asio::ip::udp::endpoint(address, port));
41 mIntervalReadCount = 0;
45 mPort = mSocket.local_endpoint().port();
47 InfoLog(<<
"UdpEchoServer: Started, localAddress=" << localAddress <<
", localPort=" << mPort);
54 mTimeOfFirstRead = chrono::steady_clock::now();
56 InfoLog(<<
"UdpEchoServer: thread completed");
64void UdpEchoServer::read()
66 mSocket.async_receive_from(asio::buffer(mReceiveBuffer,
sizeof(mReceiveBuffer)), mRemoteEndpoint,
67 [
this](asio::error_code ec, std::size_t length)
71 if (ec.value() == 10054 ||
74 InfoLog(<<
"UdpEchoServer[" << mPort <<
"]: Received 10054 read error, ignoring!");
79 ErrLog(<<
"UdpEchoServer[" << mPort <<
"]: error calling async_receive_from: error=" << ec.value() <<
", message=" << ec.message());
86 mReceiveSize = length;
87 DebugLog(<<
"UdpEchoServer[" << mPort <<
"]: Received data from: " << mRemoteEndpoint <<
", size=" << length);
96void UdpEchoServer::write()
98 mSocket.async_send_to(asio::buffer(mReceiveBuffer, mReceiveSize),
100 [
this](asio::error_code ec, std::size_t length)
104 ErrLog(<<
"UdpEchoServer[" << mPort <<
"]: error calling async_send_to: error=" << ec.value() <<
", message=" << ec.message());
115void UdpEchoServer::checkLog()
117 std::chrono::time_point<chrono::steady_clock> now = chrono::steady_clock::now();
118 long long secondsPassed = chrono::duration_cast<chrono::seconds>(now - mTimeOfFirstRead).count();
119 if (secondsPassed > 30)
121 InfoLog(<<
"UdpEchoServer[" << mPort <<
"]: Echo'd " << mIntervalReadCount <<
" packets in the last " << secondsPassed <<
" seconds.");
122 mIntervalReadCount = 0;
123 mTimeOfFirstRead = now;
static void setExclusiveAddressUse(asio::ip::udp::socket &socket)
For a UDP socket, between open() and bind().
UdpEchoServer(const Data &localAddress, unsigned int port)
An alternative to std::string, encapsulates an arbitrary buffer of bytes.
const char * c_str() const
Returns a null-terminated string representing.
dcm! – add UnusedChecking(_enum) below;