40 int _status = wl_status_t::WL_DISCONNECTED;
41 bool is_blocking =
false;
42 static std::vector<EthernetServer*>& active_servers() {
43 static std::vector<EthernetServer*>
servers;
46 static void cleanupAll(
int sig) {
47 for (
auto*
server : active_servers()) {
62 SignalHandler::registerHandler(
SIGINT, cleanupAll);
63 SignalHandler::registerHandler(
SIGTERM, cleanupAll);
71 auto&
servers = active_servers();
77 void begin() { begin(_port); }
78 void begin(
int port) { begin_(port); }
91 _status = wl_status_t::WL_DISCONNECTED;
95 virtual size_t write(
uint8_t ch) {
return write(&
ch, 1); }
96 virtual size_t write(
const uint8_t*
buf,
size_t size) {
97 int rc = ::write(server_fd,
buf, size);
103 int status() {
return _status; }
109 bool begin_(
int port = 0) {
110 if (port > 0) _port = port;
111 _status = wl_status_t::WL_DISCONNECTED;
116 _status = wl_status_t::WL_CONNECT_FAILED;
130 server_addr.sin_family =
AF_INET;
132 server_addr.sin_port =
htons(_port);
135 while (::bind(server_fd, (
struct sockaddr*)&server_addr,
136 sizeof(server_addr)) < 0) {
139 Logger.error(
"bind failed");
145 if (::listen(server_fd, 10) < 0) {
147 _status = wl_status_t::WL_CONNECT_FAILED;
148 Logger.error(
"listen failed");
153 active_servers().push_back(
this);
154 _status = wl_status_t::WL_CONNECTED;
158 void setBlocking(
bool flag) { is_blocking =
flag; }
165 if (_status == wl_status_t::WL_CONNECT_FAILED) {
186 Logger.error(
"accept failed");