Skip to content

Commit

Permalink
SocketServer support Local sockets on Windows and some more cleaning
Browse files Browse the repository at this point in the history
  • Loading branch information
aslze committed Jun 5, 2024
1 parent 74f2e8f commit 5e97283
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 186 deletions.
2 changes: 1 addition & 1 deletion include/asl/SocketServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class ASL_API SocketServer
/** Makes the server start listening. This function blocks by default. If the `nonblocking` argument is `true`
the server will listen in its own thread and the call will not block. */
void start(bool nonblocking=false);
/** Assigns a Unix local socket to listen to (Only on Linux). */
/** Assigns a Unix local socket to listen to (where supported). */
bool bindPath(const String& sname);
/** Assigns a TCP port to listen to. */
bool bind(int port) { return bind("0.0.0.0", port); }
Expand Down
6 changes: 2 additions & 4 deletions include/asl/String.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@
#ifndef ASL_STRING_H
#define ASL_STRING_H

#include <asl/defs.h>
#include <asl/Array.h>
#include <string.h>
#include <stdio.h>
#include <wchar.h>
#include <asl/Array.h>

#if defined(MINGW) || !defined __GNUC__
#define ASL_LONG_FMT "I64i"
Expand Down Expand Up @@ -532,7 +530,7 @@ class ASL_API String
/**
Returns the length of this string in wchar_t wide chars (UTF16 code units)
*/
int wlength() const { const wchar_t* w(*(String*)this); return (int)wcslen(w); }
int wlength() const;
/**
Returns the number of full characters (code points) in the string
*/
Expand Down
1 change: 0 additions & 1 deletion src/Socket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -782,4 +782,3 @@ Socket_* LocalSocket_::accept()

}

//#include "MulticastSocket.cpp"
351 changes: 176 additions & 175 deletions src/SocketServer.cpp
Original file line number Diff line number Diff line change
@@ -1,182 +1,183 @@
#include <asl/SocketServer.h>
#include <asl/Thread.h>
#ifdef ASL_TLS
#include <asl/TlsSocket.h>
#endif
#include <stdio.h>

namespace asl {

struct SockClientThread : public Thread
{
SocketServer* _server;
Socket _client;

SockClientThread(SocketServer* svr, const Socket& cli):
_server(svr), _client(cli)
{
start();
}
void run()
{
_server->serve(_client);
_client.close();
--_server->_numClients;
delete this;
}
};

struct SockServerThread : public Thread
{
SocketServer* _server;

SockServerThread(SocketServer* svr):
_server(svr)
{
}
void run()
{
_server->startLoop();
}
};

SocketServer::SocketServer()
{
_thread = NULL;
_requestStop = false;
_sequential = false;
_running = false;
_numClients = 0;
}

SocketServer::~SocketServer()
{
if(_thread) {
_thread->kill();
delete _thread;
}
}

bool SocketServer::bind(const String& ip, int port)
{
Socket server;
if(server.bind(ip, port))
{
server.listen(40);
_sockets << server;
return true;
}
_socketError = server.errorMsg();
return false;
}

#ifdef ASL_TLS
bool SocketServer::bindTLS(const String& ip, int port)
{
TlsSocket server;
if(server.bind(ip, port))
{
server.listen(40);
_sockets << server;
return true;
}
_socketError = server.errorMsg();
return false;
}
#endif

bool SocketServer::bindPath(const String& sname)
{
#ifndef _WIN32
LocalSocket server;
if(server.bind(sname))
{
server.listen(5);
_sockets << server;
return true;
}
_socketError = server.errorMsg();
#include <asl/SocketServer.h>
#include <asl/Thread.h>
#ifdef ASL_TLS
#include <asl/TlsSocket.h>
#endif
#include <stdio.h>

namespace asl {

struct SockClientThread : public Thread
{
SocketServer* _server;
Socket _client;

SockClientThread(SocketServer* svr, const Socket& cli):
_server(svr), _client(cli)
{
start();
}
void run()
{
_server->serve(_client);
_client.close();
--_server->_numClients;
delete this;
}
};

struct SockServerThread : public Thread
{
SocketServer* _server;

SockServerThread(SocketServer* svr):
_server(svr)
{
}
void run()
{
_server->startLoop();
}
};

SocketServer::SocketServer()
{
_thread = NULL;
_requestStop = false;
_sequential = false;
_running = false;
_numClients = 0;
}

SocketServer::~SocketServer()
{
if(_thread) {
_thread->kill();
delete _thread;
}
}

bool SocketServer::bind(const String& ip, int port)
{
Socket server;
if(server.bind(ip, port))
{
server.listen(40);
_sockets << server;
return true;
}
_socketError = server.errorMsg();
return false;
}

#ifdef ASL_TLS
bool SocketServer::bindTLS(const String& ip, int port)
{
TlsSocket server;
if(server.bind(ip, port))
{
server.listen(40);
_sockets << server;
return true;
}
_socketError = server.errorMsg();
return false;
}
#endif

bool SocketServer::bindPath(const String& sname)
{
#if !defined(_WIN32) || defined(ASL_SOCKET_LOCAL)
LocalSocket server;
if(server.bind(sname))
{
server.listen(5);
_sockets << server;
return true;
}
_socketError = server.errorMsg();
#else
(void)sname;
#endif
return false;
}

void SocketServer::startLoop()
{
int n;
do
{
if ((n = _sockets.waitInput(2)) > 0)
{
for (int i = 0; i < n; i++)
{
Socket client = _sockets.activeAt(i).accept();
++_numClients;
if (_sequential) {
serve(client);
client.close();
--_numClients;
}
else
new SockClientThread(this, client);
}
}
if(_requestStop || n < 0)
{
_running = false;
break;
}

}
while(true);
}

void SocketServer::start(bool nonblocking)
{
_running = true;

if(nonblocking) {
_thread = new SockServerThread(this);
_thread->start();
}
else
startLoop();
}

void SocketServer::stop(bool sync)
{
_requestStop = true;

if (sync)
{
do {
sleep(0.1);
} while (_running || _numClients > 0);
}
_socketError = "SOCKET_BAD_BIND";
#endif
return false;
}

void SocketServer::startLoop()
{
int n;
do
{
if ((n = _sockets.waitInput(2)) > 0)
{
for (int i = 0; i < n; i++)
{
Socket client = _sockets.activeAt(i).accept();
++_numClients;
if (_sequential) {
serve(client);
client.close();
--_numClients;
}
else
new SockClientThread(this, client);
}
}
if(_requestStop || n < 0)
{
_running = false;
break;
}

}
while(true);
}

void SocketServer::start(bool nonblocking)
{
_running = true;

if(nonblocking) {
_thread = new SockServerThread(this);
_thread->start();
}
else
startLoop();
}

void SocketServer::stop(bool sync)
{
_requestStop = true;

if (sync)
{
do {
sleep(0.1);
} while (_running || _numClients > 0);
}
}

String SocketServer::socketError() const
{
return _socketError;
}

#ifdef ASL_TLS
bool SocketServer::useCert(const String& cert, const String& key)
{
for (int i = 0; i < _sockets.length(); i++)
{
if (TlsSocket s = _sockets[i].as<TlsSocket>())
{
if (!s.useCert(cert) || !s.useKey(key))
{
_socketError = s.errorMsg();
return false;
}
}
}
return true;
}
#endif

}
}

#ifdef ASL_TLS
bool SocketServer::useCert(const String& cert, const String& key)
{
for (int i = 0; i < _sockets.length(); i++)
{
if (TlsSocket s = _sockets[i].as<TlsSocket>())
{
if (!s.useCert(cert) || !s.useKey(key))
{
_socketError = s.errorMsg();
return false;
}
}
}
return true;
}
#endif

}
Loading

0 comments on commit 5e97283

Please sign in to comment.