Fix crash on server stop
Commit amended to initialize listening variable by Adam Honse <calcprogrammer1@gmail.com>
This commit is contained in:
parent
300e2b526b
commit
79dacbaeb0
3 changed files with 87 additions and 9 deletions
|
|
@ -36,8 +36,9 @@ using namespace std::chrono_literals;
|
||||||
|
|
||||||
NetworkServer::NetworkServer(std::vector<RGBController *>& control) : controllers(control)
|
NetworkServer::NetworkServer(std::vector<RGBController *>& control) : controllers(control)
|
||||||
{
|
{
|
||||||
port_num = OPENRGB_SDK_PORT;
|
port_num = OPENRGB_SDK_PORT;
|
||||||
server_online = false;
|
server_online = false;
|
||||||
|
server_listening = false;
|
||||||
ConnectionThread = nullptr;
|
ConnectionThread = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,6 +74,21 @@ void NetworkServer::DeviceListChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkServer::ServerListeningChanged()
|
||||||
|
{
|
||||||
|
ServerListeningChangeMutex.lock();
|
||||||
|
|
||||||
|
/*-------------------------------------------------*\
|
||||||
|
| Server state has changed, call the callbacks |
|
||||||
|
\*-------------------------------------------------*/
|
||||||
|
for(unsigned int callback_idx = 0; callback_idx < ServerListeningChangeCallbacks.size(); callback_idx++)
|
||||||
|
{
|
||||||
|
ServerListeningChangeCallbacks[callback_idx](ServerListeningChangeCallbackArgs[callback_idx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerListeningChangeMutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
unsigned short NetworkServer::GetPort()
|
unsigned short NetworkServer::GetPort()
|
||||||
{
|
{
|
||||||
return port_num;
|
return port_num;
|
||||||
|
|
@ -83,6 +99,11 @@ bool NetworkServer::GetOnline()
|
||||||
return server_online;
|
return server_online;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NetworkServer::GetListening()
|
||||||
|
{
|
||||||
|
return server_listening;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int NetworkServer::GetNumClients()
|
unsigned int NetworkServer::GetNumClients()
|
||||||
{
|
{
|
||||||
return ServerClients.size();
|
return ServerClients.size();
|
||||||
|
|
@ -154,6 +175,12 @@ void NetworkServer::RegisterClientInfoChangeCallback(NetServerCallback new_callb
|
||||||
ClientInfoChangeCallbackArgs.push_back(new_callback_arg);
|
ClientInfoChangeCallbackArgs.push_back(new_callback_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkServer::RegisterServerListeningChangeCallback(NetServerCallback new_callback, void * new_callback_arg)
|
||||||
|
{
|
||||||
|
ServerListeningChangeCallbacks.push_back(new_callback);
|
||||||
|
ServerListeningChangeCallbackArgs.push_back(new_callback_arg);
|
||||||
|
}
|
||||||
|
|
||||||
void NetworkServer::SetPort(unsigned short new_port)
|
void NetworkServer::SetPort(unsigned short new_port)
|
||||||
{
|
{
|
||||||
if(server_online == false)
|
if(server_online == false)
|
||||||
|
|
@ -204,7 +231,33 @@ void NetworkServer::StartServer()
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
if (bind(server_sock, (sockaddr*)&myAddress, sizeof(myAddress)) == SOCKET_ERROR)
|
if (bind(server_sock, (sockaddr*)&myAddress, sizeof(myAddress)) == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
printf("Error: Could not bind network socket \nIs port %hu already being used?\n", GetPort());
|
if(errno == EADDRINUSE)
|
||||||
|
{
|
||||||
|
printf("Error: Could not bind network socket \nIs port %hu already being used?\n", GetPort());
|
||||||
|
}
|
||||||
|
else if(errno == EACCES)
|
||||||
|
{
|
||||||
|
printf("Error: Access to socket was denied.\n");
|
||||||
|
}
|
||||||
|
else if(errno == EBADF)
|
||||||
|
{
|
||||||
|
printf("Error: sockfd is not a valid file descriptor.\n");
|
||||||
|
}
|
||||||
|
else if(errno == EINVAL)
|
||||||
|
{
|
||||||
|
printf("Error: The socket is already bound to an address, or addrlen is wrong, or addr is not a valid address for this socket's domain..\n");
|
||||||
|
}
|
||||||
|
else if(errno == ENOTSOCK)
|
||||||
|
{
|
||||||
|
printf("Error: The file descriptor sockfd does not refer to a socket.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// could be a linux specific error
|
||||||
|
// https://man7.org/linux/man-pages/man2/bind.2.html
|
||||||
|
printf("Error: Could not bind network socket, error code:%d\n", errno);
|
||||||
|
}
|
||||||
|
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -215,7 +268,6 @@ void NetworkServer::StartServer()
|
||||||
setsockopt(server_sock, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
|
setsockopt(server_sock, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
|
||||||
|
|
||||||
server_online = true;
|
server_online = true;
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
/*-------------------------------------------------*\
|
||||||
| Start the connection thread |
|
| Start the connection thread |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
|
|
@ -243,7 +295,6 @@ void NetworkServer::StopServer()
|
||||||
|
|
||||||
if(ConnectionThread)
|
if(ConnectionThread)
|
||||||
{
|
{
|
||||||
ConnectionThread->join();
|
|
||||||
delete ConnectionThread;
|
delete ConnectionThread;
|
||||||
ConnectionThread = nullptr;
|
ConnectionThread = nullptr;
|
||||||
}
|
}
|
||||||
|
|
@ -279,6 +330,9 @@ void NetworkServer::ConnectionThreadFunction()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server_listening = true;
|
||||||
|
ServerListeningChanged();
|
||||||
|
|
||||||
/*-------------------------------------------------*\
|
/*-------------------------------------------------*\
|
||||||
| Accept the client connection |
|
| Accept the client connection |
|
||||||
\*-------------------------------------------------*/
|
\*-------------------------------------------------*/
|
||||||
|
|
@ -291,6 +345,9 @@ void NetworkServer::ConnectionThreadFunction()
|
||||||
printf("Connection thread closed\r\n");
|
printf("Connection thread closed\r\n");
|
||||||
server_online = false;
|
server_online = false;
|
||||||
|
|
||||||
|
server_listening = false;
|
||||||
|
ServerListeningChanged();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -324,6 +381,8 @@ void NetworkServer::ConnectionThreadFunction()
|
||||||
|
|
||||||
printf("Connection thread closed\r\n");
|
printf("Connection thread closed\r\n");
|
||||||
server_online = false;
|
server_online = false;
|
||||||
|
server_listening = false;
|
||||||
|
ServerListeningChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
int NetworkServer::accept_select(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
int NetworkServer::accept_select(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||||
|
|
@ -333,7 +392,7 @@ int NetworkServer::accept_select(int sockfd, struct sockaddr *addr, socklen_t *a
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
timeout.tv_sec = 5;
|
timeout.tv_sec = TCP_TIMEOUT_SECONDS;
|
||||||
timeout.tv_usec = 0;
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
FD_ZERO(&set); /* clear the set */
|
FD_ZERO(&set); /* clear the set */
|
||||||
|
|
@ -364,8 +423,8 @@ int NetworkServer::recv_select(SOCKET s, char *buf, int len, int flags)
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
timeout.tv_sec = 5;
|
timeout.tv_sec = TCP_TIMEOUT_SECONDS;
|
||||||
timeout.tv_usec = 0;
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
FD_ZERO(&set); /* clear the set */
|
FD_ZERO(&set); /* clear the set */
|
||||||
FD_SET(s, &set); /* add our file descriptor to the set */
|
FD_SET(s, &set); /* add our file descriptor to the set */
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#define TCP_TIMEOUT_SECONDS 5
|
||||||
|
|
||||||
typedef void (*NetServerCallback)(void *);
|
typedef void (*NetServerCallback)(void *);
|
||||||
|
|
||||||
struct NetworkClientInfo
|
struct NetworkClientInfo
|
||||||
|
|
@ -35,6 +37,7 @@ public:
|
||||||
|
|
||||||
unsigned short GetPort();
|
unsigned short GetPort();
|
||||||
bool GetOnline();
|
bool GetOnline();
|
||||||
|
bool GetListening();
|
||||||
unsigned int GetNumClients();
|
unsigned int GetNumClients();
|
||||||
const char * GetClientString(unsigned int client_num);
|
const char * GetClientString(unsigned int client_num);
|
||||||
const char * GetClientIP(unsigned int client_num);
|
const char * GetClientIP(unsigned int client_num);
|
||||||
|
|
@ -44,6 +47,9 @@ public:
|
||||||
void DeviceListChanged();
|
void DeviceListChanged();
|
||||||
void RegisterClientInfoChangeCallback(NetServerCallback, void * new_callback_arg);
|
void RegisterClientInfoChangeCallback(NetServerCallback, void * new_callback_arg);
|
||||||
|
|
||||||
|
void ServerListeningChanged();
|
||||||
|
void RegisterServerListeningChangeCallback(NetServerCallback, void * new_callback_arg);
|
||||||
|
|
||||||
void SetPort(unsigned short new_port);
|
void SetPort(unsigned short new_port);
|
||||||
|
|
||||||
void StartServer();
|
void StartServer();
|
||||||
|
|
@ -65,6 +71,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
unsigned short port_num;
|
unsigned short port_num;
|
||||||
bool server_online;
|
bool server_online;
|
||||||
|
bool server_listening;
|
||||||
|
|
||||||
std::vector<RGBController *>& controllers;
|
std::vector<RGBController *>& controllers;
|
||||||
|
|
||||||
|
|
@ -76,6 +83,10 @@ protected:
|
||||||
std::vector<NetServerCallback> ClientInfoChangeCallbacks;
|
std::vector<NetServerCallback> ClientInfoChangeCallbacks;
|
||||||
std::vector<void *> ClientInfoChangeCallbackArgs;
|
std::vector<void *> ClientInfoChangeCallbackArgs;
|
||||||
|
|
||||||
|
std::mutex ServerListeningChangeMutex;
|
||||||
|
std::vector<NetServerCallback> ServerListeningChangeCallbacks;
|
||||||
|
std::vector<void *> ServerListeningChangeCallbackArgs;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
WSADATA wsa;
|
WSADATA wsa;
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ OpenRGBServerInfoPage::OpenRGBServerInfoPage(NetworkServer * server, QWidget *pa
|
||||||
UpdateInfo();
|
UpdateInfo();
|
||||||
|
|
||||||
network_server->RegisterClientInfoChangeCallback(UpdateInfoCallback, this);
|
network_server->RegisterClientInfoChangeCallback(UpdateInfoCallback, this);
|
||||||
|
network_server->RegisterServerListeningChangeCallback(UpdateInfoCallback, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
OpenRGBServerInfoPage::~OpenRGBServerInfoPage()
|
OpenRGBServerInfoPage::~OpenRGBServerInfoPage()
|
||||||
|
|
@ -31,7 +32,14 @@ void OpenRGBServerInfoPage::UpdateInfo()
|
||||||
{
|
{
|
||||||
ui->ServerPortValue->setText(std::to_string(network_server->GetPort()).c_str());
|
ui->ServerPortValue->setText(std::to_string(network_server->GetPort()).c_str());
|
||||||
|
|
||||||
if(network_server->GetOnline())
|
if(network_server->GetListening() && !network_server->GetOnline())
|
||||||
|
{
|
||||||
|
ui->ServerStatusValue->setText("Stopping...");
|
||||||
|
ui->ServerStartButton->setEnabled(false);
|
||||||
|
ui->ServerStopButton->setEnabled(false);
|
||||||
|
ui->ServerPortValue->setEnabled(false);
|
||||||
|
}
|
||||||
|
else if(network_server->GetListening())
|
||||||
{
|
{
|
||||||
ui->ServerStatusValue->setText("Online");
|
ui->ServerStatusValue->setText("Online");
|
||||||
ui->ServerStartButton->setEnabled(false);
|
ui->ServerStartButton->setEnabled(false);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue