A header-only library with socket classes:
TcpClient
- template class for a TCP client socketTcpServer
- template class for a TCP Server supporting multiple client connectionsUdpSocket
- template class for a UDP Multicast/Unicast
- Optional dependency on
fmt
for error string formatting - C++14 or later
- CMake
- gtest and gmock for unit tests. Enable unit tests by specifying
-DBUILD_TESTS=ON
when runningCMake
struct SocketOpt {
/**
* @brief Value passed to setsockopt(SO_SNDBUF)
*
*/
int m_txBufSize = TX_BUFFER_SIZE;
/**
* @brief Value passed to setsockopt(SO_RCVBUF)
*
*/
int m_rxBufSize = RX_BUFFER_SIZE;
/**
* @brief Socket listen address
*
*/
std::string m_listenAddr = "0.0.0.0";
};
The UdpSocket class is templated on the "callback" class which receives data via UDP.
The template argument type must support the following interface:
void onReceiveData(const char *data, size_t size) ;
The UdpSocket class has the following interface for managing the UDP socket:
// Constructor
UdpSocket(CallbackImpl &callback, SocketOpt *options = nullptr);
// Start a multicast socket
SocketRet startMcast(const char *mcastAddr, uint16_t port);
// Start a unicast client/server socket
SocketRet startUnicast(const char *remoteAddr, uint16_t localPort, uint16_t port)
// Start a unicast server-only socket
SocketRet startUnicast(uint16_t localPort);
// Send data via UDP
SocketRet sendMsg(const char *msg, size_t size);
// Shutdown the UDP socket
void finish();
The TcpClient class is templated on the "callback" class which receives data via TCP.
The template argument type must support the following interface:
void onReceiveData(const char *data, size_t size);
void onDisconnect(const sockets::SocketRet &ret);
The TcpClient class has the following interface for managing the TCP client connection:
// Constructor
TcpClient(CallbackImpl &callback, SocketOpt *options = nullptr);
// Connect to a TCP server
SocketRet connectTo(const char *remoteIp, uint16_t remotePort);
// Send data to the TCP server
SocketRet sendMsg(const char *msg, size_t size);
// Shutdown the TCP client socket
void finish();
The TcpServer class is templated on the "callback" class which manages the TCP server.
The template argument must support the following interface:
void onClientConnect(const sockets::ClientHandle &client);
void onReceiveClientData(const sockets::ClientHandle &client, const char *data, size_t size);
void onClientDisconnect(const sockets::ClientHandle &client, const sockets::SocketRet &ret);
The TcpServer class has the following interfaces:
// Create a TCP server socket
TcpServer(CallbackImpl &callback, SocketOpt *options = nullptr);
// Start the server listening on the specified port
SocketRet start(uint16_t port);
// Send a message to all connected clients
SocketRet sendBcast(const char *msg, size_t size);
// Send a message to a specific client connection
SocketRet sendClientMessage(ClientHandle &clientId, const char *msg, size_t size);
// Shutdown the TCP server socket
void finish();
Enable building sample apps by specifying -DBUILD_EXAMPLES=ON
when running CMake
.
$ ./clientApp -a <ipAddr> -p <port>
$ ./serverApp -p <port> -L <listenAddr>
$ ./mcastApp -m <multicastAddr> -p <port>
$ ./unicastApp -a <ipAddr> -l <localPort> -p <remotePort> -L <listenAddr>