diff options
author | Tom Rondeau <trondeau@vt.edu> | 2013-03-13 21:14:41 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2013-03-13 21:14:41 -0400 |
commit | 0fb2e888a48c0bd618109c5dd86e570ab93a6ff4 (patch) | |
tree | 57ff2b6ef821dd49410d068eb2b1ce1d5e13004d | |
parent | 1bacc04f7a8f2f9c868a9934624683c7cefb2300 (diff) |
blocks: fixing some UDP handling of ports/options; using gr-blocks blocks in QA.
-rw-r--r-- | gr-blocks/lib/udp_sink_impl.cc | 3 | ||||
-rw-r--r-- | gr-blocks/lib/udp_source_impl.cc | 24 | ||||
-rw-r--r-- | gr-blocks/python/qa_udp_source_sink.py | 16 |
3 files changed, 31 insertions, 12 deletions
diff --git a/gr-blocks/lib/udp_sink_impl.cc b/gr-blocks/lib/udp_sink_impl.cc index 500b7c2cd7..db21da3eeb 100644 --- a/gr-blocks/lib/udp_sink_impl.cc +++ b/gr-blocks/lib/udp_sink_impl.cc @@ -82,6 +82,9 @@ namespace gr { d_socket = new boost::asio::ip::udp::socket(d_io_service); d_socket->open(boost::asio::ip::udp::v4()); + boost::asio::socket_base::reuse_address roption(true); + d_socket->set_option(roption); + d_connected = true; } } diff --git a/gr-blocks/lib/udp_source_impl.cc b/gr-blocks/lib/udp_source_impl.cc index 16ed72ca21..e6e9caf8ad 100644 --- a/gr-blocks/lib/udp_source_impl.cc +++ b/gr-blocks/lib/udp_source_impl.cc @@ -79,9 +79,17 @@ namespace gr { d_host = host; d_port = static_cast<unsigned short>(port); + std::string s_port; + s_port = (boost::format("%d")%d_port).str(); + if(host.size() > 0) { - d_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), d_port); - d_socket = new boost::asio::ip::udp::socket(d_io_service, d_endpoint); + boost::asio::ip::udp::resolver resolver(d_io_service); + boost::asio::ip::udp::resolver::query query(boost::asio::ip::udp::v4(), + host, s_port); + d_endpoint = *resolver.resolve(query); + + d_socket = new boost::asio::ip::udp::socket(d_io_service); + d_socket->open(d_endpoint.protocol()); boost::asio::socket_base::linger loption(true, 0); d_socket->set_option(loption); @@ -89,6 +97,8 @@ namespace gr { boost::asio::socket_base::reuse_address roption(true); d_socket->set_option(roption); + d_socket->bind(d_endpoint); + start_receive(); d_udp_thread = gruel::thread(boost::bind(&udp_source_impl::run_io_service, this)); d_connected = true; @@ -115,7 +125,8 @@ namespace gr { int udp_source_impl::get_port(void) { - return d_endpoint.port(); + //return d_endpoint.port(); + return d_socket->local_endpoint().port(); } void @@ -137,7 +148,9 @@ namespace gr { if(d_eof && (bytes_transferred == 1) && (d_rxbuf[0] == 0x00)) { // If we are using EOF notification, test for it and don't // add anything to the output. - d_residual = 0; + d_residual = -1; + d_cond_wait.notify_one(); + return; } else { // Make sure we never go beyond the boundary of the @@ -175,6 +188,9 @@ namespace gr { boost::unique_lock<boost::mutex> lock(d_udp_mutex); d_cond_wait.wait(lock); + if(d_residual < 0) + return -1; + int to_be_sent = (int)(d_residual - d_sent); int to_send = std::min(noutput_items, to_be_sent); diff --git a/gr-blocks/python/qa_udp_source_sink.py b/gr-blocks/python/qa_udp_source_sink.py index 6ebbf87afc..4ab1430b09 100644 --- a/gr-blocks/python/qa_udp_source_sink.py +++ b/gr-blocks/python/qa_udp_source_sink.py @@ -58,14 +58,14 @@ class test_udp_sink_source(gr_unittest.TestCase): def test_002(self): port = 65500 - n_data = 100000 + n_data = 100 src_data = [float(x) for x in range(n_data)] expected_result = tuple(src_data) src = gr.vector_source_f(src_data, False) - udp_snd = gr.udp_sink(gr.sizeof_float, 'localhost', port) + udp_snd = blocks.udp_sink(gr.sizeof_float, 'localhost', port) self.tb_snd.connect(src, udp_snd) - udp_rcv = gr.udp_source(gr.sizeof_float, 'localhost', port) + udp_rcv = blocks.udp_source(gr.sizeof_float, 'localhost', port) dst = gr.vector_sink_f() self.tb_rcv.connect(udp_rcv, dst) @@ -83,11 +83,11 @@ class test_udp_sink_source(gr_unittest.TestCase): self.assert_(not self.timeout) def test_003(self): - udp_rcv = gr.udp_source( gr.sizeof_float, '0.0.0.0', 0, eof=False ) + udp_rcv = blocks.udp_source(gr.sizeof_float, '0.0.0.0', 0, eof=False) rcv_port = udp_rcv.get_port() - udp_snd = gr.udp_sink( gr.sizeof_float, '127.0.0.1', 65500 ) - udp_snd.connect( 'localhost', rcv_port ) + udp_snd = blocks.udp_sink(gr.sizeof_float, '127.0.0.1', 65500) + udp_snd.connect('localhost', rcv_port) n_data = 16 src_data = [float(x) for x in range(n_data)] @@ -95,8 +95,8 @@ class test_udp_sink_source(gr_unittest.TestCase): src = gr.vector_source_f(src_data) dst = gr.vector_sink_f() - self.tb_snd.connect( src, udp_snd ) - self.tb_rcv.connect( udp_rcv, dst ) + self.tb_snd.connect(src, udp_snd) + self.tb_rcv.connect(udp_rcv, dst) self.tb_rcv.start() self.tb_snd.run() |