#include "RGBController.h" #include "NetworkProtocol.h" #include "net_port.h" #include #pragma once typedef void (*NetServerCallback)(void *); struct NetworkClientInfo { SOCKET client_sock; std::thread * client_listen_thread; std::string client_string; char client_ip[INET_ADDRSTRLEN]; }; class NetworkServer { public: NetworkServer(std::vector& control); unsigned short GetPort(); bool GetOnline(); unsigned int GetNumClients(); const char * GetClientString(unsigned int client_num); const char * GetClientIP(unsigned int client_num); void RegisterClientInfoChangeCallback(NetServerCallback, void * new_callback_arg); void SetPort(unsigned short new_port); void StartServer(); void StopServer(); void ConnectionThreadFunction(); void ListenThreadFunction(NetworkClientInfo * client_sock); void SendReply_ControllerCount(SOCKET client_sock); void SendReply_ControllerData(SOCKET client_sock, unsigned int dev_idx); protected: unsigned short port_num; bool server_online; std::vector& controllers; std::vector ServerClients; std::thread * ConnectionThread; std::vector ClientInfoChangeCallbacks; std::vector ClientInfoChangeCallbackArgs; private: #ifdef WIN32 WSADATA wsa; #endif SOCKET server_sock; int accept_select(int sockfd, struct sockaddr *addr, socklen_t *addrlen); int recv_select(SOCKET s, char *buf, int len, int flags); };