summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2013-03-13 21:14:41 -0400
committerTom Rondeau <trondeau@vt.edu>2013-03-13 21:14:41 -0400
commit0fb2e888a48c0bd618109c5dd86e570ab93a6ff4 (patch)
tree57ff2b6ef821dd49410d068eb2b1ce1d5e13004d
parent1bacc04f7a8f2f9c868a9934624683c7cefb2300 (diff)
blocks: fixing some UDP handling of ports/options; using gr-blocks blocks in QA.
-rw-r--r--gr-blocks/lib/udp_sink_impl.cc3
-rw-r--r--gr-blocks/lib/udp_source_impl.cc24
-rw-r--r--gr-blocks/python/qa_udp_source_sink.py16
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()