diff options
Diffstat (limited to 'src/EtiReader.cpp')
-rw-r--r-- | src/EtiReader.cpp | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/src/EtiReader.cpp b/src/EtiReader.cpp index a28deb2..499e837 100644 --- a/src/EtiReader.cpp +++ b/src/EtiReader.cpp @@ -534,28 +534,39 @@ void EdiReader::assemble() EdiUdpInput::EdiUdpInput(EdiDecoder::ETIDecoder& decoder) : m_enabled(false), m_port(0), + m_bindto("0.0.0.0"), + m_mcastaddr("0.0.0.0"), m_decoder(decoder) { } + void EdiUdpInput::Open(const std::string& uri) { etiLog.level(info) << "Opening EDI :" << uri; + size_t found_port = uri.find_first_of(":", 6); + if(found_port == string::npos) + throw std::invalid_argument("EDI input port must be provided"); + + m_port =std::stoi(uri.substr(found_port+1)); + std::string host_full=uri.substr(6, found_port-6);// ignore udp:// + size_t found_mcast = host_full.find_first_of("@"); //have multicast address: + if(found_mcast != string::npos) { + if(found_mcast>0) + m_bindto=host_full.substr(0,found_mcast); + m_mcastaddr=host_full.substr(found_mcast+1); + } else if(found_port != 6) { + m_bindto=host_full; + } - const std::regex re_udp("udp://:([0-9]+)"); - std::smatch m; - if (std::regex_match(uri, m, re_udp)) { - m_port = std::stoi(m[1].str()); - - etiLog.level(info) << "EDI port :" << m_port; + etiLog.level(info) << "EDI input: host:" << m_bindto << ", source:" << m_mcastaddr << ", port:" << m_port; - // The max_fragments_queued is only a protection against a runaway - // memory usage. - // Rough calculation: - // 300 seconds, 24ms per frame, up to 20 fragments per frame - const size_t max_fragments_queued = 20 * 300 * 1000 / 24; + // The max_fragments_queued is only a protection against a runaway + // memory usage. + // Rough calculation: + // 300 seconds, 24ms per frame, up to 20 fragments per frame + const size_t max_fragments_queued = 20 * 300 * 1000 / 24; - m_udp_rx.start(m_port, max_fragments_queued); - m_enabled = true; - } + m_udp_rx.start(m_port, m_bindto, m_mcastaddr, max_fragments_queued); + m_enabled = true; } bool EdiUdpInput::rxPacket() |