diff --git a/common/TracySocket.cpp b/common/TracySocket.cpp index fedb0a7b..8256f93d 100644 --- a/common/TracySocket.cpp +++ b/common/TracySocket.cpp @@ -218,6 +218,48 @@ bool Socket::Connect( const char* addr, int port ) return true; } +bool Socket::ConnectBlocking( const char* addr, int port ) +{ + assert( !IsValid() ); + assert( !m_ptr ); + + struct addrinfo hints; + struct addrinfo *res, *ptr; + + memset( &hints, 0, sizeof( hints ) ); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + char portbuf[32]; + sprintf( portbuf, "%i", port ); + + if( getaddrinfo( addr, portbuf, &hints, &res ) != 0 ) return false; + int sock = 0; + for( ptr = res; ptr; ptr = ptr->ai_next ) + { + if( ( sock = socket( ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol ) ) == -1 ) continue; +#if defined __APPLE__ + int val = 1; + setsockopt( sock, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof( val ) ); +#endif + if( connect( sock, ptr->ai_addr, ptr->ai_addrlen ) == -1 ) + { +#ifdef _WIN32 + closesocket( sock ); +#else + close( sock ); +#endif + continue; + } + break; + } + freeaddrinfo( res ); + if( !ptr ) return false; + + m_sock.store( sock, std::memory_order_relaxed ); + return true; +} + void Socket::Close() { const auto sock = m_sock.load( std::memory_order_relaxed ); diff --git a/common/TracySocket.hpp b/common/TracySocket.hpp index c84f7c4d..60c90f2c 100644 --- a/common/TracySocket.hpp +++ b/common/TracySocket.hpp @@ -24,6 +24,7 @@ public: ~Socket(); bool Connect( const char* addr, int port ); + bool ConnectBlocking( const char* addr, int port ); void Close(); int Send( const void* buf, int len );