summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2013-11-16 14:56:35 -0500
committerTom Rondeau <tom@trondeau.com>2013-11-16 16:02:44 -0500
commitf8eaa663165897f2477f80b805b435afd35bd17d (patch)
tree75c3bf210559ea143dcb0d54ca8a3e1bcd63e9aa
parenta0831c51094c4adb9ffba63ffe3bcccc480d19d6 (diff)
blocks: updated UDP source to handle no network connections by allowing use of loopback device. Also fixed an infrequent problem on shutdown before the thread exited.
Updated QA code to verify ports used will not clash.
-rw-r--r--gr-blocks/lib/udp_sink_impl.cc3
-rw-r--r--gr-blocks/lib/udp_source_impl.cc9
-rw-r--r--gr-blocks/python/blocks/qa_udp_source_sink.py8
3 files changed, 13 insertions, 7 deletions
diff --git a/gr-blocks/lib/udp_sink_impl.cc b/gr-blocks/lib/udp_sink_impl.cc
index a23d3274cb..ae6488f6dd 100644
--- a/gr-blocks/lib/udp_sink_impl.cc
+++ b/gr-blocks/lib/udp_sink_impl.cc
@@ -77,7 +77,8 @@ namespace gr {
if(host.size() > 0) {
boost::asio::ip::udp::resolver resolver(d_io_service);
boost::asio::ip::udp::resolver::query query(boost::asio::ip::udp::v4(),
- host, s_port);
+ host, s_port,
+ boost::asio::ip::resolver_query_base::passive);
d_endpoint = *resolver.resolve(query);
d_socket = new boost::asio::ip::udp::socket(d_io_service);
diff --git a/gr-blocks/lib/udp_source_impl.cc b/gr-blocks/lib/udp_source_impl.cc
index 7f4a2af3d3..5fa06072ae 100644
--- a/gr-blocks/lib/udp_source_impl.cc
+++ b/gr-blocks/lib/udp_source_impl.cc
@@ -85,7 +85,8 @@ namespace gr {
if(host.size() > 0) {
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_host, s_port,
+ boost::asio::ip::resolver_query_base::passive);
d_endpoint = *resolver.resolve(query);
d_socket = new boost::asio::ip::udp::socket(d_io_service);
@@ -113,7 +114,9 @@ namespace gr {
if(!d_connected)
return;
+ d_io_service.reset();
d_io_service.stop();
+ d_udp_thread.join();
d_socket->close();
delete d_socket;
@@ -156,11 +159,11 @@ namespace gr {
// Make sure we never go beyond the boundary of the
// residual buffer. This will just drop the last bit of
// data in the buffer if we've run out of room.
- if((int)(d_residual + bytes_transferred) > (50*d_payload_size)) {
+ if((int)(d_residual + bytes_transferred) >= (50*d_payload_size)) {
GR_LOG_WARN(d_logger, "Too much data; dropping packet.");
}
else {
- // otherwise, copy receid data into local buffer for
+ // otherwise, copy received data into local buffer for
// copying later.
memcpy(d_residbuf+d_residual, d_rxbuf, bytes_transferred);
d_residual += bytes_transferred;
diff --git a/gr-blocks/python/blocks/qa_udp_source_sink.py b/gr-blocks/python/blocks/qa_udp_source_sink.py
index b96d393a50..a8dcdef5ea 100644
--- a/gr-blocks/python/blocks/qa_udp_source_sink.py
+++ b/gr-blocks/python/blocks/qa_udp_source_sink.py
@@ -39,7 +39,7 @@ class test_udp_sink_source(gr_unittest.TestCase):
def test_001(self):
# Tests calling disconnect/reconnect.
- port = 65500
+ port = 65510
n_data = 16
src_data = [x for x in range(n_data)]
@@ -56,7 +56,7 @@ class test_udp_sink_source(gr_unittest.TestCase):
self.tb_snd.run()
def test_002(self):
- port = 65500
+ port = 65520
n_data = 100
src_data = [float(x) for x in range(n_data)]
@@ -83,10 +83,12 @@ class test_udp_sink_source(gr_unittest.TestCase):
self.assert_(not self.timeout)
def test_003(self):
+ port = 65530
+
udp_rcv = blocks.udp_source(gr.sizeof_float, '0.0.0.0', 0, eof=False)
rcv_port = udp_rcv.get_port()
- udp_snd = blocks.udp_sink(gr.sizeof_float, '127.0.0.1', 65500)
+ udp_snd = blocks.udp_sink(gr.sizeof_float, '127.0.0.1', port)
udp_snd.connect('localhost', rcv_port)
n_data = 16