aboutsummaryrefslogtreecommitdiffstats
path: root/src/EtiReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/EtiReader.cpp')
-rw-r--r--src/EtiReader.cpp39
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()