mirror of
https://github.com/wolfpld/tracy.git
synced 2026-09-13 22:08:16 +00:00
Adopting a pre-bound socket via SetReservedListenSocket left Worker()'s port bookkeeping untouched, so GetPort() and the broadcast announcement reported the computed default instead of the port the socket listens on. The monitor kept this correct by mirroring the reserved port into TRACY_PORT; direct users of the public API had no such coupling. The bound socket is now authoritative: Worker() reads the local port back via getsockname after binding. The search-loop bookkeeping stays only as a fallback for a getsockname failure.
177 lines
3.7 KiB
C++
177 lines
3.7 KiB
C++
#ifndef __TRACYSOCKET_HPP__
|
|
#define __TRACYSOCKET_HPP__
|
|
|
|
#include <atomic>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
struct addrinfo;
|
|
struct sockaddr;
|
|
|
|
namespace tracy
|
|
{
|
|
|
|
#ifdef _WIN32
|
|
void InitWinSock();
|
|
#endif
|
|
|
|
class Socket
|
|
{
|
|
public:
|
|
Socket();
|
|
Socket( int sock );
|
|
~Socket();
|
|
|
|
bool Connect( const char* addr, uint16_t port );
|
|
void Close();
|
|
|
|
int Send( const void* buf, int len );
|
|
int GetSendBufSize();
|
|
|
|
int ReadUpTo( void* buf, int len );
|
|
bool Read( void* buf, int len, int timeout );
|
|
|
|
template<typename ShouldExit>
|
|
bool Read( void* buf, int len, int timeout, ShouldExit exitCb )
|
|
{
|
|
auto cbuf = (char*)buf;
|
|
while( len > 0 )
|
|
{
|
|
if( exitCb() ) return false;
|
|
if( !ReadImpl( cbuf, len, timeout ) ) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
template<typename ShouldExit>
|
|
int ReadUpTo( void* buf, int len, int timeout, ShouldExit exitCb )
|
|
{
|
|
auto cbuf = (char*)buf;
|
|
int rd = 0;
|
|
while( len > 0 )
|
|
{
|
|
if( exitCb() ) return rd;
|
|
char* p = cbuf;
|
|
int l = len;
|
|
if( !ReadImpl( p, l, timeout ) ) return rd;
|
|
const auto step = len - l;
|
|
rd += step;
|
|
cbuf += step;
|
|
len -= step;
|
|
}
|
|
return rd;
|
|
}
|
|
|
|
bool ReadRaw( void* buf, int len, int timeout );
|
|
bool HasData();
|
|
bool IsValid() const;
|
|
bool IsConnecting() const;
|
|
|
|
Socket( const Socket& ) = delete;
|
|
Socket( Socket&& ) = delete;
|
|
Socket& operator=( const Socket& ) = delete;
|
|
Socket& operator=( Socket&& ) = delete;
|
|
|
|
private:
|
|
int RecvBuffered( void* buf, int len, int timeout );
|
|
int Recv( void* buf, int len, int timeout );
|
|
|
|
bool ReadImpl( char*& buf, int& len, int timeout );
|
|
|
|
char* m_buf;
|
|
char* m_bufPtr;
|
|
std::atomic<int> m_sock;
|
|
int m_bufLeft;
|
|
|
|
struct addrinfo *m_res;
|
|
struct addrinfo *m_ptr;
|
|
int m_connSock;
|
|
};
|
|
|
|
class ListenSocket
|
|
{
|
|
public:
|
|
ListenSocket();
|
|
~ListenSocket();
|
|
|
|
bool Listen( uint16_t port, int backlog );
|
|
Socket* Accept();
|
|
void Close();
|
|
void Adopt( int fd );
|
|
uint16_t LocalPort() const;
|
|
|
|
ListenSocket( const ListenSocket& ) = delete;
|
|
ListenSocket( ListenSocket&& ) = delete;
|
|
ListenSocket& operator=( const ListenSocket& ) = delete;
|
|
ListenSocket& operator=( ListenSocket&& ) = delete;
|
|
|
|
private:
|
|
int m_sock;
|
|
};
|
|
|
|
class UdpBroadcast
|
|
{
|
|
public:
|
|
UdpBroadcast();
|
|
~UdpBroadcast();
|
|
|
|
bool Open( const char* addr, uint16_t port );
|
|
void Close();
|
|
|
|
int Send( uint16_t port, const void* data, int len );
|
|
|
|
UdpBroadcast( const UdpBroadcast& ) = delete;
|
|
UdpBroadcast( UdpBroadcast&& ) = delete;
|
|
UdpBroadcast& operator=( const UdpBroadcast& ) = delete;
|
|
UdpBroadcast& operator=( UdpBroadcast&& ) = delete;
|
|
|
|
private:
|
|
int m_sock;
|
|
uint32_t m_addr;
|
|
};
|
|
|
|
class IpAddress
|
|
{
|
|
public:
|
|
IpAddress();
|
|
~IpAddress();
|
|
|
|
void Set( const struct sockaddr& addr );
|
|
|
|
uint32_t GetNumber() const { return m_number; }
|
|
const char* GetText() const { return m_text; }
|
|
|
|
IpAddress( const IpAddress& ) = delete;
|
|
IpAddress( IpAddress&& ) = delete;
|
|
IpAddress& operator=( const IpAddress& ) = delete;
|
|
IpAddress& operator=( IpAddress&& ) = delete;
|
|
|
|
private:
|
|
uint32_t m_number;
|
|
char m_text[17];
|
|
};
|
|
|
|
class UdpListen
|
|
{
|
|
public:
|
|
UdpListen();
|
|
~UdpListen();
|
|
|
|
bool Listen( uint16_t port );
|
|
void Close();
|
|
|
|
const char* Read( size_t& len, IpAddress& addr, int timeout );
|
|
|
|
UdpListen( const UdpListen& ) = delete;
|
|
UdpListen( UdpListen&& ) = delete;
|
|
UdpListen& operator=( const UdpListen& ) = delete;
|
|
UdpListen& operator=( UdpListen&& ) = delete;
|
|
|
|
private:
|
|
int m_sock;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|