#include "Server.h" #include "utility/w5500.h" #include "utility/socket.h" void EthernetMaketServer::setServerHandler(std::function handler) { serverHandler = handler; } void EthernetMaketServer::resetServerHandler() { serverHandler = [](EthernetMaketClient &sclient) {}; } EthernetMaketClient EthernetMaketServer::available(int sock) { accept(sock); EthernetClient client(sock); if (EthernetClass::_server_port[sock] == _port && (client.status() == SnSR::ESTABLISHED || client.status() == SnSR::CLOSE_WAIT)) { if (client.available()) { return std::move(EthernetMaketClient(client)); } } return std::move(EthernetMaketClient(MAX_SOCK_NUM)); } void EthernetMaketServer::accept(int sock) { int listening = 0; EthernetClient client(sock); if (EthernetClass::_server_port[sock] == _port) { if (client.status() == SnSR::LISTEN) { listening = 1; } else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) { Serial.println("HARD STOP"); client.stop(); } } if (!listening) { // begin(); begin(sock); // added } } void EthernetMaketServer::begin(int sock) { EthernetClient client(sock); if (client.status() == SnSR::CLOSED) { socket(sock, SnMR::TCP, _port, 0); listen(sock); EthernetClass::_server_port[sock] = _port; serverSocket = sock; return; } // Serial.println(F("EthernetMaketServer::begin() FAIL")); } void EthernetMaketServer::begin() { for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { EthernetClient client(sock); if (client.status() == SnSR::CLOSED) { socket(sock, SnMR::TCP, _port, 0); listen(sock); EthernetClass::_server_port[sock] = _port; serverSocket = sock; break; } } // Serial.println(F("EthernetMaketServer::begin() FAIL")); } void EthernetMaketServer::tick() { // for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { sclient = available(serverSocket); if (sclient.connected() && sclient.available() > 0) { sclient.activityUpdate(); serverHandler(sclient); } // if (!wasConnected && sclient.connected()) // { // wasConnected = true; // Serial.println("Client connected"); // } // if (wasConnected && !sclient.connected()) // { // wasConnected = false; // sclient.stop(); // // begin(serverSocket); // Serial.println("Client disconnected"); // } // // Закрытие соединения по таймеру неактивности // if (sclient.connected() && (millis() - lastActivityTime > timeout)) // { // Serial.println("Connection closed due to inactivity"); // sclient.close(); // // begin(serverSocket); // } } // sclient.tick_(); }