tracy/common/TracySocket.hpp

154 lines
3.0 KiB
C++
Raw Normal View History

2017-09-11 20:51:11 +00:00
#ifndef __TRACYSOCKET_HPP__
#define __TRACYSOCKET_HPP__
2020-05-13 17:12:52 +00:00
#include <atomic>
2020-04-13 12:14:36 +00:00
#include <stdint.h>
#include "TracyForceInline.hpp"
struct addrinfo;
struct sockaddr;
2017-09-11 20:51:11 +00:00
namespace tracy
{
2019-01-19 11:03:30 +00:00
#ifdef _WIN32
2018-08-19 15:45:03 +00:00
void InitWinSock();
#endif
2017-09-11 20:51:11 +00:00
class Socket
{
public:
Socket();
Socket( int sock );
~Socket();
bool Connect( const char* addr, int port );
2017-09-11 20:51:11 +00:00
void Close();
int Send( const void* buf, int len );
int GetSendBufSize();
2017-09-11 20:51:11 +00:00
bool Read( void* buf, int len, int timeout );
2020-04-13 12:14:36 +00:00
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;
}
2019-02-10 14:45:23 +00:00
bool ReadRaw( void* buf, int len, int timeout );
bool HasData();
2019-12-19 16:23:40 +00:00
bool IsValid() const;
2017-09-13 00:08:30 +00:00
2017-09-11 20:51:11 +00:00
Socket( const Socket& ) = delete;
Socket( Socket&& ) = delete;
Socket& operator=( const Socket& ) = delete;
Socket& operator=( Socket&& ) = delete;
private:
2019-02-10 14:45:23 +00:00
int RecvBuffered( void* buf, int len, int timeout );
int Recv( void* buf, int len, int timeout );
2020-04-13 12:14:36 +00:00
bool ReadImpl( char*& buf, int& len, int timeout );
char* m_buf;
char* m_bufPtr;
2020-05-13 17:12:52 +00:00
std::atomic<int> m_sock;
int m_bufLeft;
struct addrinfo *m_res;
struct addrinfo *m_ptr;
int m_connSock;
2017-09-11 20:51:11 +00:00
};
class ListenSocket
{
public:
ListenSocket();
~ListenSocket();
2019-09-21 13:11:15 +00:00
bool Listen( int port, int backlog );
2017-10-18 17:49:17 +00:00
Socket* Accept();
2017-09-11 20:51:11 +00:00
void Close();
ListenSocket( const ListenSocket& ) = delete;
ListenSocket( ListenSocket&& ) = delete;
ListenSocket& operator=( const ListenSocket& ) = delete;
ListenSocket& operator=( ListenSocket&& ) = delete;
private:
int m_sock;
};
2019-06-17 00:24:55 +00:00
class UdpBroadcast
{
public:
UdpBroadcast();
~UdpBroadcast();
2019-09-21 13:11:15 +00:00
bool Open( const char* addr, int port );
2019-06-17 00:24:55 +00:00
void Close();
2019-06-17 16:37:34 +00:00
int Send( int port, const void* data, int len );
2019-06-17 00:24:55 +00:00
UdpBroadcast( const UdpBroadcast& ) = delete;
UdpBroadcast( UdpBroadcast&& ) = delete;
UdpBroadcast& operator=( const UdpBroadcast& ) = delete;
UdpBroadcast& operator=( UdpBroadcast&& ) = delete;
private:
int m_sock;
};
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( int port );
void Close();
const char* Read( size_t& len, IpAddress& addr );
UdpListen( const UdpListen& ) = delete;
UdpListen( UdpListen&& ) = delete;
UdpListen& operator=( const UdpListen& ) = delete;
UdpListen& operator=( UdpListen&& ) = delete;
private:
int m_sock;
};
2017-09-11 20:51:11 +00:00
}
#endif