This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
cb-legacy-dev/Samples/tcptest/tcpserver.h
2023-11-18 17:56:10 +01:00

114 lines
3.8 KiB
C++

#ifndef TCPSERVER_H
#define TCPSERVER_H
#include "wx/wx.h"
#include "wx/socket.h"
#include "wx/event.h"
#include <list>
#include <map>
DECLARE_EVENT_TYPE(EV_CLIENTCONNECTED, wxCommandEvent);
DECLARE_EVENT_TYPE(EV_CLIENTDISCONNECTED, wxCommandEvent);
DECLARE_EVENT_TYPE(EV_ONDATA, wxCommandEvent);
DECLARE_EVENT_TYPE(EV_ONERROR, wxCommandEvent);
DECLARE_EVENT_TYPE(EV_ONCLOSE, wxCommandEvent);
class SimpleTCPServer : public wxEvtHandler
{
public:
int maxClients;
int logLevel;
SimpleTCPServer(wxEvtHandler* parent, wxWindowID id); // Constructor
virtual ~SimpleTCPServer(); // Destructor
void Open( unsigned int port = NULL ); // This will start listening (address is optional, port can be also set with different function)
wxSocketBase *currentClient; // Client currently interacting with server (automatically updated when someone connects or send data)
wxString ReadStr( wxSocketBase* sock = NULL ); // Read from buffer as string, provide socket to read or use default one
// Write string to socket (provide a socket or use currentClient)
void WriteStr( wxString str_in, wxSocketBase* sock = NULL );
// Write string to provided "ip:port" if a matching socket is connected
void WriteStr( wxString str_in, wxString ip_port );
// Write data (for example char array) to socket (provide a socket or use currentClient)
void Write( const void *data, unsigned int dataBytes, wxSocketBase* sock = NULL );
// Write data (for example char array) to provided "ip:port" if a matching socket is connected
void Write( const void *data, unsigned int dataBytes, wxString ip_port );
// Peek buffer as string, provide socket to read or use default one
wxString PeekStr(wxSocketBase* sock = NULL);
// Peek buffer, provide socket to read or use default one
int Peek( void *buffer, unsigned int nbytes, wxSocketBase* sock = NULL );
// Read buffer, provide socket to read or use default one
int Read( void *buffer, unsigned int nbytes, wxSocketBase* sock = NULL );
void Close(); // This will stop listening and disconnect everyone
void DropClient(wxSocketBase *sock); // This will disconnect chosen client
void DropClient(wxString ip_port); // This will disconnect chosen client
unsigned int Port( unsigned int port = 0 ); // Return current port number (if no arguments) or set new port number (if specified)
unsigned int clientCount() { return connectedClients; }; // Returns number of connected clients
// Connected clients will be stored here along with info
// wxSocketBase* is the actual socket, wxString is human-readable representation of address
std::map<wxSocketBase*, wxString> clientMap;
wxTextCtrl *logBox; // Text control to be used as log output (optional)
void OnServerEvent(wxSocketEvent &event);
void OnClientEvent(wxSocketEvent &event);
void OnRecv(wxSocketBase *sock);
void OnConnLost(wxSocketBase *sock);
bool IsOk()
{
if (Listener) return Listener->IsOk();
else return false;
}
private:
wxEvtHandler * m_parent; // Parent form
wxWindowID m_id; // ID assigned to current instance of server
wxSocketServer* Listener; // Server things will be handled here
unsigned int connectedClients; // Client count is stored here
unsigned int srvPort;
void LogServer( wxString logText ); // Log will be printed with this function if required
static const long SERVER_ID; // For event handling
static const long CLIENT_ID; // For event handling
DECLARE_EVENT_TABLE() // For event handling
};
#endif // TCPSERVER_H