diff options
author | Tom Rondeau <trondeau@vt.edu> | 2013-03-13 19:04:21 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2013-03-13 19:04:21 -0400 |
commit | 41c0eb43e2177f3e22f4f72ca8e99d6580944b21 (patch) | |
tree | 75936cbeb0aa8e43404a715f430fc537cb1fa005 /gnuradio-core/src/lib | |
parent | 3e33c4655ca02d831ecef17f30264afc962965af (diff) |
blocks: removing udp_source/sink from gnuradio-core; now in gr-blocks.
Diffstat (limited to 'gnuradio-core/src/lib')
-rw-r--r-- | gnuradio-core/src/lib/io/CMakeLists.txt | 2 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_udp_sink.cc | 304 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_udp_sink.h | 112 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_udp_sink.i | 46 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_udp_source.cc | 374 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_udp_source.h | 110 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_udp_source.i | 41 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/io.i | 4 |
8 files changed, 0 insertions, 993 deletions
diff --git a/gnuradio-core/src/lib/io/CMakeLists.txt b/gnuradio-core/src/lib/io/CMakeLists.txt index afd1d46b3e..7aeea798cd 100644 --- a/gnuradio-core/src/lib/io/CMakeLists.txt +++ b/gnuradio-core/src/lib/io/CMakeLists.txt @@ -83,8 +83,6 @@ set(gr_core_io_triple_threats microtune_4937_eval_board ppio sdr_1000 - gr_udp_sink - gr_udp_source ) foreach(file_tt ${gr_core_io_triple_threats}) diff --git a/gnuradio-core/src/lib/io/gr_udp_sink.cc b/gnuradio-core/src/lib/io/gr_udp_sink.cc deleted file mode 100644 index 6b1d34ef7e..0000000000 --- a/gnuradio-core/src/lib/io/gr_udp_sink.cc +++ /dev/null @@ -1,304 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2008,2009,2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include <boost/asio.hpp> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#include <gr_udp_sink.h> -#include <gr_io_signature.h> -#include <stdexcept> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#if defined(HAVE_NETDB_H) -#include <netdb.h> -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> //usually included by <netdb.h>? -#endif -typedef void* optval_t; -#elif defined(HAVE_WINDOWS_H) -// if not posix, assume winsock -#define USING_WINSOCK -#include <winsock2.h> -#include <ws2tcpip.h> -#define SHUT_RDWR 2 -typedef char* optval_t; -#endif - -#include <gruel/thread.h> - -#define SNK_VERBOSE 0 - -static int is_error( int perr ) -{ - // Compare error to posix error code; return nonzero if match. -#if defined(USING_WINSOCK) -#define ENOPROTOOPT 109 -#define ECONNREFUSED 111 - // All codes to be checked for must be defined below - int werr = WSAGetLastError(); - switch( werr ) { - case WSAETIMEDOUT: - return( perr == EAGAIN ); - case WSAENOPROTOOPT: - return( perr == ENOPROTOOPT ); - case WSAECONNREFUSED: - return( perr == ECONNREFUSED ); - default: - fprintf(stderr,"gr_udp_source/is_error: unknown error %d\n", perr ); - throw std::runtime_error("internal error"); - } - return 0; -#else - return( perr == errno ); -#endif -} - -static void report_error( const char *msg1, const char *msg2 ) -{ - // Deal with errors, both posix and winsock -#if defined(USING_WINSOCK) - int werr = WSAGetLastError(); - fprintf(stderr, "%s: winsock error %d\n", msg1, werr ); -#else - perror(msg1); -#endif - if( msg2 != NULL ) - throw std::runtime_error(msg2); - return; -} - -gr_udp_sink::gr_udp_sink (size_t itemsize, - const char *host, unsigned short port, - int payload_size, bool eof) - : gr_sync_block ("udp_sink", - gr_make_io_signature (1, 1, itemsize), - gr_make_io_signature (0, 0, 0)), - d_itemsize (itemsize), d_payload_size(payload_size), d_eof(eof), - d_socket(-1), d_connected(false) -{ -#if defined(USING_WINSOCK) // for Windows (with MinGW) - // initialize winsock DLL - WSADATA wsaData; - int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); - if( iResult != NO_ERROR ) { - report_error( "gr_udp_source WSAStartup", "can't open socket" ); - } -#endif - - // create socket - d_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if(d_socket == -1) { - report_error("socket open","can't open socket"); - } - - // Don't wait when shutting down - linger lngr; - lngr.l_onoff = 1; - lngr.l_linger = 0; - if(setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (optval_t)&lngr, sizeof(linger)) == -1) { - if( !is_error(ENOPROTOOPT) ) { // no SO_LINGER for SOCK_DGRAM on Windows - report_error("SO_LINGER","can't set socket option SO_LINGER"); - } - } - - // Get the destination address - connect(host, port); -} - -// public constructor that returns a shared_ptr - -gr_udp_sink_sptr -gr_make_udp_sink (size_t itemsize, - const char *host, unsigned short port, - int payload_size, bool eof) -{ - return gnuradio::get_initial_sptr(new gr_udp_sink (itemsize, - host, port, - payload_size, eof)); -} - -gr_udp_sink::~gr_udp_sink () -{ - if (d_connected) - disconnect(); - - if (d_socket != -1){ - shutdown(d_socket, SHUT_RDWR); -#if defined(USING_WINSOCK) - closesocket(d_socket); -#else - ::close(d_socket); -#endif - d_socket = -1; - } - -#if defined(USING_WINSOCK) // for Windows (with MinGW) - // free winsock resources - WSACleanup(); -#endif -} - -int -gr_udp_sink::work (int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - const char *in = (const char *) input_items[0]; - ssize_t r=0, bytes_sent=0, bytes_to_send=0; - ssize_t total_size = noutput_items*d_itemsize; - - #if SNK_VERBOSE - printf("Entered udp_sink\n"); - #endif - - gruel::scoped_lock guard(d_mutex); // protect d_socket - - while(bytes_sent < total_size) { - bytes_to_send = std::min((ssize_t)d_payload_size, (total_size-bytes_sent)); - - if(d_connected) { - r = send(d_socket, (in+bytes_sent), bytes_to_send, 0); - if(r == -1) { // error on send command - if( is_error(ECONNREFUSED) ) - r = bytes_to_send; // discard data until receiver is started - else { - report_error("udp_sink",NULL); // there should be no error case where - return -1; // this function should not exit immediately - } - } - } - else - r = bytes_to_send; // discarded for lack of connection - bytes_sent += r; - - #if SNK_VERBOSE - printf("\tbyte sent: %d bytes\n", r); - #endif - } - - #if SNK_VERBOSE - printf("Sent: %d bytes (noutput_items: %d)\n", bytes_sent, noutput_items); - #endif - - return noutput_items; -} - -void gr_udp_sink::connect( const char *host, unsigned short port ) -{ - if(d_connected) - disconnect(); - - if(host != NULL ) { - // Get the destination address - struct addrinfo *ip_dst; - struct addrinfo hints; - memset( (void*)&hints, 0, sizeof(hints) ); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; - char port_str[12]; - sprintf( port_str, "%d", port ); - - // FIXME leaks if report_error throws below - int ret = getaddrinfo( host, port_str, &hints, &ip_dst ); - if( ret != 0 ) - report_error("gr_udp_source/getaddrinfo", - "can't initialize destination socket" ); - - // don't need d_mutex lock when !d_connected - if(::connect(d_socket, ip_dst->ai_addr, ip_dst->ai_addrlen) == -1) { - report_error("socket connect","can't connect to socket"); - } - d_connected = true; - - freeaddrinfo(ip_dst); - } - - return; -} - -void gr_udp_sink::disconnect() -{ - if(!d_connected) - return; - - #if SNK_VERBOSE - printf("gr_udp_sink disconnecting\n"); - #endif - - gruel::scoped_lock guard(d_mutex); // protect d_socket from work() - - // Send a few zero-length packets to signal receiver we are done - if(d_eof) { - int i; - for( i = 0; i < 3; i++ ) - (void) send( d_socket, NULL, 0, 0 ); // ignore errors - } - - // Sending EOF can produce ERRCONNREFUSED errors that won't show up - // until the next send or recv, which might confuse us if it happens - // on a new connection. The following does a nonblocking recv to - // clear any such errors. - timeval timeout; - timeout.tv_sec = 0; // zero time for immediate return - timeout.tv_usec = 0; - fd_set readfds; - FD_ZERO(&readfds); - FD_SET(d_socket, &readfds); - int r = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout); - if(r < 0) { - #if SNK_VERBOSE - report_error("udp_sink/select",NULL); - #endif - } - else if(r > 0) { // call recv() to get error return - r = recv(d_socket, (char*)&readfds, sizeof(readfds), 0); - if(r < 0) { - #if SNK_VERBOSE - report_error("udp_sink/recv",NULL); - #endif - } - } - - // Since I can't find any way to disconnect a datagram socket in Cygwin, - // we just leave it connected but disable sending. -#if 0 - // zeroed address structure should reset connection - struct sockaddr addr; - memset( (void*)&addr, 0, sizeof(addr) ); - // addr.sa_family = AF_UNSPEC; // doesn't work on Cygwin - // addr.sa_family = AF_INET; // doesn't work on Cygwin - - if(::connect(d_socket, &addr, sizeof(addr)) == -1) - report_error("socket connect","can't connect to socket"); -#endif - - d_connected = false; - - return; -} diff --git a/gnuradio-core/src/lib/io/gr_udp_sink.h b/gnuradio-core/src/lib/io/gr_udp_sink.h deleted file mode 100644 index bf042a6d12..0000000000 --- a/gnuradio-core/src/lib/io/gr_udp_sink.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2008,2009,2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_UDP_SINK_H -#define INCLUDED_GR_UDP_SINK_H - -#include <gr_core_api.h> -#include <gr_sync_block.h> -#include <gruel/thread.h> - -class gr_udp_sink; -typedef boost::shared_ptr<gr_udp_sink> gr_udp_sink_sptr; - -GR_CORE_API gr_udp_sink_sptr -gr_make_udp_sink (size_t itemsize, - const char *host, unsigned short port, - int payload_size=1472, bool eof=true); - -/*! - * \brief Write stream to an UDP socket. - * \ingroup sink_blk - * - * \param itemsize The size (in bytes) of the item datatype - * \param host The name or IP address of the receiving host; use - * NULL or None for no connection - * \param port Destination port to connect to on receiving host - * \param payload_size UDP payload size by default set to 1472 = - * (1500 MTU - (8 byte UDP header) - (20 byte IP header)) - * \param eof Send zero-length packet on disconnect - */ - -class GR_CORE_API gr_udp_sink : public gr_sync_block -{ - friend GR_CORE_API gr_udp_sink_sptr gr_make_udp_sink (size_t itemsize, - const char *host, - unsigned short port, - int payload_size, bool eof); - private: - size_t d_itemsize; - - int d_payload_size; // maximum transmission unit (packet length) - bool d_eof; // send zero-length packet on disconnect - int d_socket; // handle to socket - bool d_connected; // are we connected? - gruel::mutex d_mutex; // protects d_socket and d_connected - - protected: - /*! - * \brief UDP Sink Constructor - * - * \param itemsize The size (in bytes) of the item datatype - * \param host The name or IP address of the receiving host; use - * NULL or None for no connection - * \param port Destination port to connect to on receiving host - * \param payload_size UDP payload size by default set to - * 1472 = (1500 MTU - (8 byte UDP header) - (20 byte IP header)) - * \param eof Send zero-length packet on disconnect - */ - gr_udp_sink (size_t itemsize, - const char *host, unsigned short port, - int payload_size, bool eof); - - public: - ~gr_udp_sink (); - - /*! \brief return the PAYLOAD_SIZE of the socket */ - int payload_size() { return d_payload_size; } - - /*! \brief Change the connection to a new destination - * - * \param host The name or IP address of the receiving host; use - * NULL or None to break the connection without closing - * \param port Destination port to connect to on receiving host - * - * Calls disconnect() to terminate any current connection first. - */ - void connect( const char *host, unsigned short port ); - - /*! \brief Send zero-length packet (if eof is requested) then stop sending - * - * Zero-byte packets can be interpreted as EOF by gr_udp_source. Note that - * disconnect occurs automatically when the sink is destroyed, but not when - * its top_block stops.*/ - void disconnect(); - - // should we export anything else? - - int work (int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); -}; - -#endif /* INCLUDED_GR_UDP_SINK_H */ diff --git a/gnuradio-core/src/lib/io/gr_udp_sink.i b/gnuradio-core/src/lib/io/gr_udp_sink.i deleted file mode 100644 index ba7043937a..0000000000 --- a/gnuradio-core/src/lib/io/gr_udp_sink.i +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - - -GR_SWIG_BLOCK_MAGIC(gr,udp_sink) - -gr_udp_sink_sptr -gr_make_udp_sink (size_t itemsize, - const char *host, unsigned short port, - int payload_size=1472, bool eof=true) throw (std::runtime_error); - -class gr_udp_sink : public gr_sync_block -{ - protected: - gr_udp_sink (size_t itemsize, - const char *host, unsigned short port, - int payload_size, bool eof) - throw (std::runtime_error); - - public: - ~gr_udp_sink (); - - int payload_size() { return d_payload_size; } - void connect( const char *host, unsigned short port ); - void disconnect(); - -}; diff --git a/gnuradio-core/src/lib/io/gr_udp_source.cc b/gnuradio-core/src/lib/io/gr_udp_source.cc deleted file mode 100644 index eca8e89d01..0000000000 --- a/gnuradio-core/src/lib/io/gr_udp_source.cc +++ /dev/null @@ -1,374 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2008,2009,2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#include <gr_udp_source.h> -#include <gr_io_signature.h> -#include <stdexcept> -#include <errno.h> -#include <stdio.h> -#include <string.h> - -#if defined(HAVE_NETDB_H) -#include <netdb.h> -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -typedef void* optval_t; - -// ntohs() on FreeBSD may require both netinet/in.h and arpa/inet.h, in order -#if defined(HAVE_NETINET_IN_H) -#include <netinet/in.h> -#endif -#if defined(HAVE_ARPA_INET_H) -#include <arpa/inet.h> -#endif - -#elif defined(HAVE_WINDOWS_H) -// if not posix, assume winsock -#define USING_WINSOCK -#include <winsock2.h> -#include <ws2tcpip.h> -#define SHUT_RDWR 2 -typedef char* optval_t; -#endif - -#define USE_SELECT 1 // non-blocking receive on all platforms -#define USE_RCV_TIMEO 0 // non-blocking receive on all but Cygwin -#define SRC_VERBOSE 0 - -static int is_error( int perr ) -{ - // Compare error to posix error code; return nonzero if match. -#if defined(USING_WINSOCK) -#define ENOPROTOOPT 109 - // All codes to be checked for must be defined below - int werr = WSAGetLastError(); - switch( werr ) { - case WSAETIMEDOUT: - return( perr == EAGAIN ); - case WSAENOPROTOOPT: - return( perr == ENOPROTOOPT ); - default: - fprintf(stderr,"gr_udp_source/is_error: unknown error %d\n", perr ); - throw std::runtime_error("internal error"); - } - return 0; -#else - return( perr == errno ); -#endif -} - -static void report_error( const char *msg1, const char *msg2 ) -{ - // Deal with errors, both posix and winsock -#if defined(USING_WINSOCK) - int werr = WSAGetLastError(); - fprintf(stderr, "%s: winsock error %d\n", msg1, werr ); -#else - perror(msg1); -#endif - if( msg2 != NULL ) - throw std::runtime_error(msg2); - return; -} - -gr_udp_source::gr_udp_source(size_t itemsize, const char *host, - unsigned short port, int payload_size, - bool eof, bool wait) - : gr_sync_block ("udp_source", - gr_make_io_signature(0, 0, 0), - gr_make_io_signature(1, 1, itemsize)), - d_itemsize(itemsize), d_payload_size(payload_size), - d_eof(eof), d_wait(wait), d_socket(-1), d_residual(0), d_temp_offset(0) -{ - int ret = 0; - -#if defined(USING_WINSOCK) // for Windows (with MinGW) - // initialize winsock DLL - WSADATA wsaData; - int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); - if( iResult != NO_ERROR ) { - report_error( "gr_udp_source WSAStartup", "can't open socket" ); - } -#endif - - // Set up the address stucture for the source address and port numbers - // Get the source IP address from the host name - struct addrinfo *ip_src; // store the source IP address to use - struct addrinfo hints; - memset( (void*)&hints, 0, sizeof(hints) ); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; - hints.ai_flags = AI_PASSIVE; - char port_str[12]; - sprintf( port_str, "%d", port ); - - // FIXME leaks if report_error throws below - ret = getaddrinfo( host, port_str, &hints, &ip_src ); - if( ret != 0 ) - report_error("gr_udp_source/getaddrinfo", - "can't initialize source socket" ); - - // FIXME leaks if report_error throws below - d_temp_buff = new char[d_payload_size]; // allow it to hold up to payload_size bytes - - // create socket - d_socket = socket(ip_src->ai_family, ip_src->ai_socktype, - ip_src->ai_protocol); - if(d_socket == -1) { - report_error("socket open","can't open socket"); - } - - // Turn on reuse address - int opt_val = 1; - if(setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (optval_t)&opt_val, sizeof(int)) == -1) { - report_error("SO_REUSEADDR","can't set socket option SO_REUSEADDR"); - } - - // Don't wait when shutting down - linger lngr; - lngr.l_onoff = 1; - lngr.l_linger = 0; - if(setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (optval_t)&lngr, sizeof(linger)) == -1) { - if( !is_error(ENOPROTOOPT) ) { // no SO_LINGER for SOCK_DGRAM on Windows - report_error("SO_LINGER","can't set socket option SO_LINGER"); - } - } - -#if USE_RCV_TIMEO - // Set a timeout on the receive function to not block indefinitely - // This value can (and probably should) be changed - // Ignored on Cygwin -#if defined(USING_WINSOCK) - DWORD timeout = 1000; // milliseconds -#else - timeval timeout; - timeout.tv_sec = 1; - timeout.tv_usec = 0; -#endif - if(setsockopt(d_socket, SOL_SOCKET, SO_RCVTIMEO, (optval_t)&timeout, sizeof(timeout)) == -1) { - report_error("SO_RCVTIMEO","can't set socket option SO_RCVTIMEO"); - } -#endif // USE_RCV_TIMEO - - // bind socket to an address and port number to listen on - if(bind (d_socket, ip_src->ai_addr, ip_src->ai_addrlen) == -1) { - report_error("socket bind","can't bind socket"); - } - freeaddrinfo(ip_src); - -} - -gr_udp_source_sptr -gr_make_udp_source (size_t itemsize, const char *ipaddr, - unsigned short port, int payload_size, bool eof, bool wait) -{ - return gnuradio::get_initial_sptr(new gr_udp_source (itemsize, ipaddr, - port, payload_size, eof, wait)); -} - -gr_udp_source::~gr_udp_source () -{ - delete [] d_temp_buff; - - if (d_socket != -1){ - shutdown(d_socket, SHUT_RDWR); -#if defined(USING_WINSOCK) - closesocket(d_socket); -#else - ::close(d_socket); -#endif - d_socket = -1; - } - -#if defined(USING_WINSOCK) // for Windows (with MinGW) - // free winsock resources - WSACleanup(); -#endif -} - -int -gr_udp_source::work (int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - char *out = (char *) output_items[0]; - ssize_t r=0, nbytes=0, bytes_received=0; - ssize_t total_bytes = (ssize_t)(d_itemsize*noutput_items); - - #if SRC_VERBOSE - printf("\nEntered udp_source\n"); - #endif - - // Remove items from temp buffer if they are in there - if(d_residual) { - nbytes = std::min(d_residual, total_bytes); - memcpy(out, d_temp_buff+d_temp_offset, nbytes); - bytes_received = nbytes; - - #if SRC_VERBOSE - printf("\tTemp buff size: %d offset: %d (bytes_received: %d) (noutput_items: %d)\n", - d_residual, d_temp_offset, bytes_received, noutput_items); - #endif - - // Increment pointer - out += bytes_received; - - // Update indexing of amount of bytes left in the buffer - d_residual -= nbytes; - d_temp_offset += nbytes; - - // Return now with what we've got. - assert(nbytes % d_itemsize == 0); - return nbytes/d_itemsize; - } - - while(1) { - // get the data into our output buffer and record the number of bytes - -#if USE_SELECT - // RCV_TIMEO doesn't work on all systems (e.g., Cygwin) - // use select() instead of, or in addition to RCV_TIMEO - fd_set readfds; - timeval timeout; - timeout.tv_sec = 1; // Init timeout each iteration. Select can modify it. - timeout.tv_usec = 0; - FD_ZERO(&readfds); - FD_SET(d_socket, &readfds); - r = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout); - if(r < 0) { - report_error("udp_source/select",NULL); - return -1; - } - else if(r == 0 ) { // timed out - if( d_wait ) { - // Allow boost thread interrupt, then try again - //boost::this_thread::interruption_point(); - //continue; - return 0; - } - else - return -1; - } -#endif // USE_SELECT - - // This is a non-blocking call with a timeout set in the constructor - r = recv(d_socket, d_temp_buff, d_payload_size, 0); // get the entire payload or the what's available - - // If r > 0, round it down to a multiple of d_itemsize - // (If sender is broken, don't propagate problem) - if (r > 0) - r = (r/d_itemsize) * d_itemsize; - - // Check if there was a problem; forget it if the operation just timed out - if(r == -1) { - if( is_error(EAGAIN) ) { // handle non-blocking call timeout - #if SRC_VERBOSE - printf("UDP receive timed out\n"); - #endif - - if( d_wait ) { - // Allow boost thread interrupt, then try again - //boost::this_thread::interruption_point(); - //continue; - return 0; - } - else - return -1; - } - else { - report_error("udp_source/recv",NULL); - return -1; - } - } - else if(r==0) { - if(d_eof) { - // zero-length packet interpreted as EOF - - #if SNK_VERBOSE - printf("\tzero-length packet received; returning EOF\n"); - #endif - - return -1; - } - else{ - // do we need to allow boost thread interrupt? - boost::this_thread::interruption_point(); - continue; - } - } - else { - // Calculate the number of bytes we can take from the buffer in this call - nbytes = std::min(r, total_bytes-bytes_received); - - // adjust the total number of bytes we have to round down to nearest integer of an itemsize - nbytes -= ((bytes_received+nbytes) % d_itemsize); - - // copy the number of bytes we want to look at here - memcpy(out, d_temp_buff, nbytes); - - d_residual = r - nbytes; // save the number of bytes stored - d_temp_offset=nbytes; // reset buffer index - - // keep track of the total number of bytes received - bytes_received += nbytes; - - // increment the pointer - out += nbytes; - - // Immediately return when data comes in - break; - } - - #if SNK_VERBOSE - printf("\tbytes received: %d bytes (nbytes: %d)\n", bytes, nbytes); - #endif - } - - #if SRC_VERBOSE - printf("Total Bytes Received: %d (bytes_received / noutput_items = %d / %d)\n", - bytes_received, bytes_received, noutput_items); - #endif - - // bytes_received is already set to some integer multiple of itemsize - return bytes_received/d_itemsize; -} - -// Return port number of d_socket -int gr_udp_source::get_port(void) -{ - sockaddr_in name; - socklen_t len = sizeof(name); - int ret = getsockname( d_socket, (sockaddr*)&name, &len ); - if( ret ) { - report_error("gr_udp_source/getsockname",NULL); - return -1; - } - return ntohs(name.sin_port); -} diff --git a/gnuradio-core/src/lib/io/gr_udp_source.h b/gnuradio-core/src/lib/io/gr_udp_source.h deleted file mode 100644 index 56dcb3c0a9..0000000000 --- a/gnuradio-core/src/lib/io/gr_udp_source.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2008,2009,2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_UDP_SOURCE_H -#define INCLUDED_GR_UDP_SOURCE_H - -#include <gr_core_api.h> -#include <gr_sync_block.h> -#include <gruel/thread.h> - -class gr_udp_source; -typedef boost::shared_ptr<gr_udp_source> gr_udp_source_sptr; - -GR_CORE_API gr_udp_source_sptr gr_make_udp_source(size_t itemsize, const char *host, - unsigned short port, - int payload_size=1472, - bool eof=true, bool wait=true); - -/*! - * \brief Read stream from an UDP socket. - * \ingroup source_blk - * - * \param itemsize The size (in bytes) of the item datatype - * \param host The name or IP address of the receiving host; can be - * NULL, None, or "0.0.0.0" to allow reading from any - * interface on the host - * \param port The port number on which to receive data; use 0 to - * have the system assign an unused port number - * \param payload_size UDP payload size by default set to 1472 = - * (1500 MTU - (8 byte UDP header) - (20 byte IP header)) - * \param eof Interpret zero-length packet as EOF (default: true) - * \param wait Wait for data if not immediately available - * (default: true) - * -*/ - -class GR_CORE_API gr_udp_source : public gr_sync_block -{ - friend GR_CORE_API gr_udp_source_sptr gr_make_udp_source(size_t itemsize, - const char *host, - unsigned short port, - int payload_size, - bool eof, bool wait); - - private: - size_t d_itemsize; - int d_payload_size; // maximum transmission unit (packet length) - bool d_eof; // zero-length packet is EOF - bool d_wait; // wait if data if not immediately available - int d_socket; // handle to socket - char *d_temp_buff; // hold buffer between calls - ssize_t d_residual; // hold information about number of bytes stored in the temp buffer - size_t d_temp_offset; // point to temp buffer location offset - - protected: - /*! - * \brief UDP Source Constructor - * - * \param itemsize The size (in bytes) of the item datatype - * \param host The name or IP address of the receiving host; can be - * NULL, None, or "0.0.0.0" to allow reading from any - * interface on the host - * \param port The port number on which to receive data; use 0 to - * have the system assign an unused port number - * \param payload_size UDP payload size by default set to 1472 = - * (1500 MTU - (8 byte UDP header) - (20 byte IP header)) - * \param eof Interpret zero-length packet as EOF (default: true) - * \param wait Wait for data if not immediately available - * (default: true) - */ - gr_udp_source(size_t itemsize, const char *host, unsigned short port, - int payload_size, bool eof, bool wait); - - public: - ~gr_udp_source(); - - /*! \brief return the PAYLOAD_SIZE of the socket */ - int payload_size() { return d_payload_size; } - - /*! \brief return the port number of the socket */ - int get_port(); - - // should we export anything else? - - int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); -}; - - -#endif /* INCLUDED_GR_UDP_SOURCE_H */ diff --git a/gnuradio-core/src/lib/io/gr_udp_source.i b/gnuradio-core/src/lib/io/gr_udp_source.i deleted file mode 100644 index 18823a356f..0000000000 --- a/gnuradio-core/src/lib/io/gr_udp_source.i +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -GR_SWIG_BLOCK_MAGIC(gr,udp_source) - -gr_udp_source_sptr -gr_make_udp_source (size_t itemsize, const char *host, - unsigned short port, int payload_size=1472, - bool eof=true, bool wait=true) throw (std::runtime_error); - -class gr_udp_source : public gr_sync_block -{ - protected: - gr_udp_source (size_t itemsize, const char *host, - unsigned short port, int payload_size, bool eof, bool wait) throw (std::runtime_error); - - public: - ~gr_udp_source (); - - int payload_size() { return d_payload_size; } - int get_port(); -}; diff --git a/gnuradio-core/src/lib/io/io.i b/gnuradio-core/src/lib/io/io.i index 5cbb8620a3..6cd3e06f47 100644 --- a/gnuradio-core/src/lib/io/io.i +++ b/gnuradio-core/src/lib/io/io.i @@ -33,8 +33,6 @@ #include <gr_oscope_sink_x.h> #include <gr_oscope_sink_f.h> #include <ppio.h> -#include <gr_udp_sink.h> -#include <gr_udp_source.h> %} %include "gr_histo_sink.i" @@ -44,7 +42,5 @@ %include "sdr_1000.i" %include "gr_oscope_sink.i" %include "ppio.i" -%include "gr_udp_sink.i" -%include "gr_udp_source.i" |