diff options
author | Clayton Smith <argilo@gmail.com> | 2020-02-09 03:10:20 +0200 |
---|---|---|
committer | Eric Wild <ewild@sysmocom.de> | 2020-08-02 23:46:14 +0200 |
commit | 137c568c6094433ce7f038cdfd4f25106c2b4b21 (patch) | |
tree | c9d864e896f47c7becd668fff6d49c0fdbf183a0 /lib | |
parent | 8cf6840da1522ec0379c7bccdb0a22e33d21c9db (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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rtl_tcp/rtl_tcp_source_c.cc | 10 |
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; |