aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClayton Smith <argilo@gmail.com>2020-02-09 03:10:20 +0200
committerEric Wild <ewild@sysmocom.de>2020-08-02 23:46:14 +0200
commit137c568c6094433ce7f038cdfd4f25106c2b4b21 (patch)
treec9d864e896f47c7becd668fff6d49c0fdbf183a0
parent8cf6840da1522ec0379c7bccdb0a22e33d21c9db (diff)
rtl_tcp: Throw an exception if TCP connection fails
Currently, rtl_tcp_source_c repeatedly calls ::connect until it succeeds. This can result in 100% CPU utilization and/or a lot of network traffic. In addition, GUI applications like Gqrx freeze up. To solve these problems, I've changed the code to report an error if ::connect fails. Signed-off-by: Eric Wild <ewild@sysmocom.de>
-rw-r--r--lib/rtl_tcp/rtl_tcp_source_c.cc10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/rtl_tcp/rtl_tcp_source_c.cc b/lib/rtl_tcp/rtl_tcp_source_c.cc
index ecdeee0..af8e300 100644
--- a/lib/rtl_tcp/rtl_tcp_source_c.cc
+++ b/lib/rtl_tcp/rtl_tcp_source_c.cc
@@ -98,7 +98,7 @@ static int is_error( int perr )
case WSAENOPROTOOPT:
return( perr == ENOPROTOOPT );
default:
- fprintf(stderr,"rtl_tcp_source_f: unknown error %d WS err %d \n", perr, werr );
+ fprintf(stderr,"rtl_tcp_source_c: unknown error %d WS err %d \n", perr, werr );
throw std::runtime_error("internal error");
}
return 0;
@@ -200,7 +200,7 @@ rtl_tcp_source_c::rtl_tcp_source_c(const std::string &args) :
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if( iResult != NO_ERROR ) {
- report_error( "rtl_tcp_source_f WSAStartup", "can't open socket" );
+ report_error( "rtl_tcp_source_c WSAStartup", "can't open socket" );
}
#endif
@@ -219,7 +219,7 @@ rtl_tcp_source_c::rtl_tcp_source_c(const std::string &args) :
// FIXME leaks if report_error throws below
int ret = getaddrinfo(host.c_str(), port_str, &hints, &ip_src);
if (ret != 0)
- report_error("rtl_tcp_source_f/getaddrinfo",
+ report_error("rtl_tcp_source_c/getaddrinfo",
"can't initialize source socket" );
d_temp_buff = new unsigned char[payload_size]; // allow it to hold up to payload_size bytes
@@ -261,8 +261,8 @@ rtl_tcp_source_c::rtl_tcp_source_c(const std::string &args) :
report_error("SO_RCVTIMEO","can't set socket option SO_RCVTIMEO");
#endif // USE_RCV_TIMEO
- while (::connect(d_socket, ip_src->ai_addr, ip_src->ai_addrlen) != 0)
- ; // FIXME handle errors?
+ if (::connect(d_socket, ip_src->ai_addr, ip_src->ai_addrlen) != 0)
+ report_error("rtl_tcp_source_c/connect","can't open TCP connection");
freeaddrinfo(ip_src);
int flag = 1;