refactor: network - harden TCP/IP and unify HTTP clients

This commit is contained in:
2026-07-29 15:35:17 +01:00
parent 75ae7ede56
commit a288dee7df
28 changed files with 1852 additions and 1361 deletions
+20 -4
View File
@@ -11,6 +11,7 @@
#include <Libraries/Memory.hpp>
#include <Terminal/Terminal.hpp>
#include <CppLib/Stream.hpp>
#include <CppLib/Spinlock.hpp>
using namespace Kt;
@@ -22,8 +23,9 @@ namespace Net::Udp {
bool Active;
};
static constexpr uint32_t MAX_BINDINGS = 16;
static constexpr uint32_t MAX_BINDINGS = 64;
static PortBinding g_bindings[MAX_BINDINGS] = {};
static kcp::Spinlock g_bindingsLock;
void Initialize() {
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
@@ -58,13 +60,18 @@ namespace Net::Udp {
const uint8_t* payload = data + HEADER_SIZE;
uint16_t payloadLen = udpLen - HEADER_SIZE;
// Dispatch to bound callback
// Snapshot the callback under the binding lock, then invoke it after
// releasing the lock so callbacks may safely bind/unbind other ports.
RecvCallback callback = nullptr;
g_bindingsLock.Acquire();
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
if (g_bindings[i].Active && g_bindings[i].Port == dstPort) {
g_bindings[i].Callback(srcIp, srcPort, dstPort, payload, payloadLen);
return;
callback = g_bindings[i].Callback;
break;
}
}
g_bindingsLock.Release();
if (callback) callback(srcIp, srcPort, dstPort, payload, payloadLen);
}
bool Send(uint32_t destIp, uint16_t srcPort, uint16_t destPort,
@@ -96,9 +103,12 @@ namespace Net::Udp {
}
bool Bind(uint16_t port, RecvCallback callback) {
if (port == 0 || callback == nullptr) return false;
g_bindingsLock.Acquire();
// Check for duplicate
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
if (g_bindings[i].Active && g_bindings[i].Port == port) {
g_bindingsLock.Release();
return false;
}
}
@@ -109,19 +119,25 @@ namespace Net::Udp {
g_bindings[i].Port = port;
g_bindings[i].Callback = callback;
g_bindings[i].Active = true;
g_bindingsLock.Release();
return true;
}
}
g_bindingsLock.Release();
return false;
}
void Unbind(uint16_t port) {
g_bindingsLock.Acquire();
for (uint32_t i = 0; i < MAX_BINDINGS; i++) {
if (g_bindings[i].Active && g_bindings[i].Port == port) {
g_bindings[i].Active = false;
g_bindings[i].Callback = nullptr;
g_bindingsLock.Release();
return;
}
}
g_bindingsLock.Release();
}
}