2024-12-09 14:57:43 +03:00

122 lines
3.0 KiB
C++

#include "Server.h"
#include "utility/w5500.h"
#include "utility/socket.h"
void EthernetMaketServer::setServerHandler(std::function<void(EthernetMaketClient)> 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_();
}