40 int _status = wl_status_t::WL_DISCONNECTED;
41 bool is_blocking =
false;
42 bool _noDelay =
false;
44 static std::vector<EthernetServer*>& active_servers() {
45 static std::vector<EthernetServer*>
servers;
48 static void cleanupAll(
int sig) {
49 for (
auto*
server : active_servers()) {
64 SignalHandler::registerHandler(
SIGINT, cleanupAll);
65 SignalHandler::registerHandler(
SIGTERM, cleanupAll);
73 auto&
servers = active_servers();
79 void begin() { begin(_port); }
80 void begin(
int port) { begin_(port); }
93 _status = wl_status_t::WL_DISCONNECTED;
97 virtual size_t write(
uint8_t ch) {
return write(&
ch, 1); }
98 virtual size_t write(
const uint8_t*
buf,
size_t size) {
99 int rc = ::write(server_fd,
buf, size);
105 int status() {
return _status; }
111 bool getNoDelay() {
return _noDelay; }
113 if (server_fd <= 0)
return false;
117 return ::poll(&
pfd, 1, 0) > 0 && (
pfd.revents &
POLLIN);
124 bool begin_(
int port = 0) {
125 if (port > 0) _port = port;
126 _status = wl_status_t::WL_DISCONNECTED;
131 _status = wl_status_t::WL_CONNECT_FAILED;
145 server_addr.sin_family =
AF_INET;
147 server_addr.sin_port =
htons(_port);
150 while (::bind(server_fd, (
struct sockaddr*)&server_addr,
151 sizeof(server_addr)) < 0) {
154 Logger.error(
"bind failed");
160 if (::listen(server_fd, 10) < 0) {
162 _status = wl_status_t::WL_CONNECT_FAILED;
163 Logger.error(
"listen failed");
170 active_servers().push_back(
this);
171 _status = wl_status_t::WL_CONNECTED;
175 void setBlocking(
bool flag) { is_blocking =
flag; }
182 if (_status == wl_status_t::WL_CONNECT_FAILED) {
203 Logger.error(
"accept failed");