feat: enhance UDPClient initialization with local port binding and add WebServerHandler for HTTP server management

This commit is contained in:
GW_MC
2026-02-02 20:46:54 +08:00
parent bcbde510e0
commit 12ad5be48a
6 changed files with 200 additions and 4 deletions

View File

@@ -19,7 +19,7 @@ UDPClient::~UDPClient() {
close();
}
esp_err_t UDPClient::init() {
esp_err_t UDPClient::init(uint16_t local_port) {
if (initialized_) {
ESP_LOGW(TAG, "Already initialized");
return ESP_OK;
@@ -31,6 +31,23 @@ esp_err_t UDPClient::init() {
return ESP_FAIL;
}
// Bind to local port if specified
if (local_port > 0) {
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(local_port);
if (bind(sock_fd_, (struct sockaddr*)&local_addr, sizeof(local_addr)) < 0) {
ESP_LOGE(TAG, "Failed to bind to port %u: errno %d", local_port, errno);
::close(sock_fd_);
sock_fd_ = -1;
return ESP_FAIL;
}
ESP_LOGI(TAG, "Bound to local port %u", local_port);
}
// Set socket to non-blocking mode
esp_err_t err = set_nonblocking();
if (err != ESP_OK) {
@@ -95,7 +112,7 @@ esp_err_t UDPClient::send_command(const std::string& command) {
}
ssize_t sent = sendto(sock_fd_, command.c_str(), command.length(), 0,
(struct sockaddr*)&remote_addr_, sizeof(remote_addr_));
(struct sockaddr*)&remote_addr_, sizeof(remote_addr_));
if (sent < 0) {
ESP_LOGE(TAG, "Failed to send command '%s': errno %d", command.c_str(), errno);
@@ -144,7 +161,7 @@ esp_err_t UDPClient::receive_response(std::string& response, int timeout_ms) {
socklen_t from_len = sizeof(from_addr);
ssize_t received = recvfrom(sock_fd_, buffer, sizeof(buffer) - 1, 0,
(struct sockaddr*)&from_addr, &from_len);
(struct sockaddr*)&from_addr, &from_len);
if (received < 0) {
ESP_LOGE(TAG, "recvfrom() failed: errno %d", errno);