diff options
Diffstat (limited to 'lib/edioutput/Transport.h')
-rw-r--r-- | lib/edioutput/Transport.h | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/edioutput/Transport.h b/lib/edioutput/Transport.h index 56ded3b..3bcc2f4 100644 --- a/lib/edioutput/Transport.h +++ b/lib/edioutput/Transport.h @@ -31,13 +31,16 @@ #include "EDIConfig.h" #include "AFPacket.h" #include "PFT.h" -#include "Interleaver.h" #include "Socket.h" #include <vector> +#include <chrono> +#include <map> #include <unordered_map> #include <stdexcept> #include <fstream> #include <cstdint> +#include <thread> +#include <mutex> namespace edi { @@ -46,10 +49,15 @@ namespace edi { class Sender { public: Sender(const configuration_t& conf); + Sender(const Sender&) = delete; + Sender operator=(const Sender&) = delete; + ~Sender(); void write(const TagPacket& tagpacket); private: + void run(); + bool m_udp_fragmentation_warning_printed = false; configuration_t m_conf; @@ -61,12 +69,16 @@ class Sender { // The AF Packet will be protected with reed-solomon and split in fragments edi::PFT edi_pft; - // To mitigate for burst packet loss, PFT fragments can be sent out-of-order - edi::Interleaver edi_interleaver; - std::unordered_map<udp_destination_t*, std::shared_ptr<Socket::UDPSocket>> udp_sockets; std::unordered_map<tcp_server_t*, std::shared_ptr<Socket::TCPDataDispatcher>> tcp_dispatchers; std::unordered_map<tcp_client_t*, std::shared_ptr<Socket::TCPSendClient>> tcp_senders; + + // PFT spreading requires sending UDP packets at specific time, independently of + // time when write() gets called + std::thread m_thread; + std::mutex m_mutex; + bool m_running = false; + std::map<std::chrono::steady_clock::time_point, edi::PFTFragment> m_pending_frames; }; } |