Add support for TRACY_ONLY_IPV4 macro to exclude listening on IPv6

This commit is contained in:
Graydon Hoare 2020-08-27 08:17:55 -07:00
parent b5f76f2cea
commit 30a6a5cdd1
No known key found for this signature in database
GPG Key ID: 69824B014EE65219
2 changed files with 18 additions and 12 deletions

View File

@ -386,33 +386,37 @@ ListenSocket::~ListenSocket()
if( m_sock != -1 ) Close(); if( m_sock != -1 ) Close();
} }
bool ListenSocket::Listen( int port, int backlog ) static int addrinfo_and_socket_for_family(int port, int ai_family, struct addrinfo** res)
{ {
assert( m_sock == -1 );
struct addrinfo* res;
struct addrinfo hints; struct addrinfo hints;
memset( &hints, 0, sizeof( hints ) ); memset( &hints, 0, sizeof( hints ) );
hints.ai_family = AF_INET6; hints.ai_family = ai_family;
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
#ifndef TRACY_ONLY_LOCALHOST #ifndef TRACY_ONLY_LOCALHOST
hints.ai_flags = AI_PASSIVE; hints.ai_flags = AI_PASSIVE;
#endif #endif
char portbuf[32]; char portbuf[32];
sprintf( portbuf, "%i", port ); sprintf( portbuf, "%i", port );
if( getaddrinfo( nullptr, portbuf, &hints, res ) != 0 ) return -1;
int sock = socket( (*res)->ai_family, (*res)->ai_socktype, (*res)->ai_protocol );
if (sock == -1) freeaddrinfo( *res );
return sock;
}
if( getaddrinfo( nullptr, portbuf, &hints, &res ) != 0 ) return false; bool ListenSocket::Listen( int port, int backlog )
{
assert( m_sock == -1 );
m_sock = socket( res->ai_family, res->ai_socktype, res->ai_protocol ); struct addrinfo* res = nullptr;
#ifndef TRACY_ONLY_IPV4
m_sock = addrinfo_and_socket_for_family(port, AF_INET6, &res);
#endif
if (m_sock == -1) if (m_sock == -1)
{ {
// IPV6 protocol may not be available/is disabled. Try to create a socket // IPV6 protocol may not be available/is disabled. Try to create a socket
// with the IPV4 protocol // with the IPV4 protocol
hints.ai_family = AF_INET; m_sock = addrinfo_and_socket_for_family(port, AF_INET, &res);
if( getaddrinfo( nullptr, portbuf, &hints, &res ) != 0 ) return false;
m_sock = socket( res->ai_family, res->ai_socktype, res->ai_protocol );
if( m_sock == -1 ) return false; if( m_sock == -1 ) return false;
} }
#if defined _WIN32 || defined __CYGWIN__ #if defined _WIN32 || defined __CYGWIN__

View File

@ -427,6 +427,8 @@ By default Tracy client will announce its presence to the local network\footnote
By default Tracy client will listen on all network interfaces. If you want to restrict it to only listening on the localhost interface, define the \texttt{TRACY\_ONLY\_LOCALHOST} macro. By default Tracy client will listen on all network interfaces. If you want to restrict it to only listening on the localhost interface, define the \texttt{TRACY\_ONLY\_LOCALHOST} macro.
By default Tracy client will listen on IPv6 interfaces, falling back to IPv4 only if IPv6 is not available. If you want to restrict it to only listening on IPv4 interfaces, define the \texttt{TRACY\_ONLY\_IPV4} macro.
\subsubsection{Setup for multi-DLL projects} \subsubsection{Setup for multi-DLL projects}
In projects that consist of multiple DLLs/shared objects things are a bit different. Compiling \texttt{TracyClient.cpp} into every DLL is not an option because this would result in several instances of Tracy objects lying around in the process. We rather need to pass the instances of them to the different DLLs to be reused there. In projects that consist of multiple DLLs/shared objects things are a bit different. Compiling \texttt{TracyClient.cpp} into every DLL is not an option because this would result in several instances of Tracy objects lying around in the process. We rather need to pass the instances of them to the different DLLs to be reused there.