mirror of
https://github.com/Show-maket/EthernetMaket.git
synced 2025-05-04 07:10:18 +00:00
122 lines
3.0 KiB
C++
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_();
|
|
}
|