5#ifdef FASTLED_HAS_NETWORKING
9 #include "platforms/win/socket_win.h"
11 #include "platforms/posix/socket_posix.h"
32bool NativeHttpServer::start() {
37 if (platformStartListening()) {
45void NativeHttpServer::stop() {
47 disconnectAllClients();
50 platformStopListening();
54bool NativeHttpServer::isListening()
const {
58void NativeHttpServer::acceptClients() {
65 ServerClientConnection conn;
66 conn.clientId = mNextClientId;
67 conn.connection = HttpConnection(mConfig);
69 asio::error_code ec = mAcceptor.accept(conn.socket);
74 conn.connection.onConnected(0);
80size_t NativeHttpServer::getClientCount()
const {
81 return mClients.size();
84bool NativeHttpServer::hasClient(u32 clientId)
const {
85 return findClient(clientId) !=
nullptr;
88void NativeHttpServer::disconnectClient(u32 clientId) {
89 removeClient(clientId);
92void NativeHttpServer::disconnectAllClients() {
98 ServerClientConnection* client = findClient(clientId);
99 if (!client || !client->socket.is_open()) {
104 size_t n = client->socket.write_some(data, ec);
107 if (ec.code == asio::errc::would_block) {
111 client->connection.onDisconnected();
115 return static_cast<int>(n);
118int NativeHttpServer::recv(u32 clientId,
fl::span<u8> buffer) {
119 ServerClientConnection* client = findClient(clientId);
120 if (!client || !client->socket.is_open()) {
125 size_t n = client->socket.read_some(buffer, ec);
128 if (ec.code == asio::errc::would_block) {
132 client->connection.onDisconnected();
137 client->connection.onHeartbeatReceived();
139 return static_cast<int>(n);
144 for (
auto& client : mClients) {
145 send(client.clientId, data);
149void NativeHttpServer::update(u32 currentTimeMs) {
151 for (
size_t i = 0; i < mClients.size(); ) {
152 auto& client = mClients[i];
155 client.connection.update(currentTimeMs);
158 if (!client.connection.isConnected() || !isSocketConnected(client.socket)) {
160 mClients.erase(mClients.begin() + i);
171 for (
const auto& client : mClients) {
177bool NativeHttpServer::platformStartListening() {
178 asio::error_code ec = mAcceptor.open(mPort);
184 mPort = mAcceptor.port();
186 ec = mAcceptor.listen(10);
195void NativeHttpServer::platformStopListening() {
199ServerClientConnection* NativeHttpServer::findClient(u32 clientId) {
200 for (
auto& client : mClients) {
201 if (client.clientId == clientId) {
208const ServerClientConnection* NativeHttpServer::findClient(u32 clientId)
const {
209 for (
const auto& client : mClients) {
210 if (client.clientId == clientId) {
217void NativeHttpServer::removeClient(u32 clientId) {
218 for (
size_t i = 0; i < mClients.size(); ++i) {
219 if (mClients[i].clientId == clientId) {
221 mClients.erase(mClients.begin() + i);
227bool NativeHttpServer::isSocketConnected(
const asio::ip::tcp::socket& sock)
const {
228 if (!sock.is_open()) {
234 socklen_t len =
sizeof(error);
235 int ret = getsockopt(sock.native_handle(), SOL_SOCKET, SO_ERROR, (
char*)&error, &len);
237 if (ret != 0 || error != 0) {
void reserve(fl::size n) FL_NOEXCEPT
void push_back(const T &value) FL_NOEXCEPT
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
Base definition for an LED controller.