38 int _status = wl_status_t::WL_DISCONNECTED;
39 bool is_blocking =
false;
40 bool _noDelay =
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 getNoDelay() {
return _noDelay; }
111 if (server_fd <= 0)
return false;
115 return ::poll(&
pfd, 1, 0) > 0 && (
pfd.revents &
POLLIN);
122 bool begin_(
int port = 0) {
123 if (port > 0) _port = port;
124 _status = wl_status_t::WL_DISCONNECTED;
127 ensureSocketRuntime();
130 _status = wl_status_t::WL_CONNECT_FAILED;
144 server_addr.sin_family =
AF_INET;
146 server_addr.sin_port =
htons(_port);
149 while (::bind(server_fd, (
struct sockaddr*)&server_addr,
150 sizeof(server_addr)) < 0) {
153 Logger.error(
"bind failed");
159 if (::listen(server_fd, 10) < 0) {
161 _status = wl_status_t::WL_CONNECT_FAILED;
162 Logger.error(
"listen failed");
169 active_servers().push_back(
this);
170 _status = wl_status_t::WL_CONNECTED;
174 void setBlocking(
bool flag) { is_blocking =
flag; }
181 if (_status == wl_status_t::WL_CONNECT_FAILED) {
202 Logger.error(
"accept failed");