LED_shit/main/dns_server.c
2025-11-04 21:33:28 +00:00

61 lines
1.8 KiB
C

#include <string.h>
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "esp_log.h"
#include "dns_server.h"
static const char *TAG = "DNS";
#define DNS_PORT 53
void start_dns_server(void) {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
ESP_LOGE(TAG, "❌ Falha ao criar socket DNS");
return;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(DNS_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
ESP_LOGE(TAG, "❌ Falha ao bind socket DNS");
close(sock);
return;
}
ESP_LOGI(TAG, "✅ DNS captive portal iniciado na porta %d", DNS_PORT);
while (1) {
char buf[512];
struct sockaddr_in source_addr;
socklen_t socklen = sizeof(source_addr);
int len = recvfrom(sock, buf, sizeof(buf), 0,
(struct sockaddr*)&source_addr, &socklen);
if (len > 0) {
// resposta simples: sempre devolve 192.168.4.1
buf[2] |= 0x80; // resposta
buf[3] |= 0x80; // autoritativo
buf[7] = 1; // 1 resposta
// append resposta A 192.168.4.1
buf[len++] = 0xC0; buf[len++] = 0x0C;
buf[len++] = 0x00; buf[len++] = 0x01; // type A
buf[len++] = 0x00; buf[len++] = 0x01; // class IN
buf[len++] = 0x00; buf[len++] = 0x00;
buf[len++] = 0x00; buf[len++] = 0x3C; // TTL 60s
buf[len++] = 0x00; buf[len++] = 0x04; // data length
buf[len++] = 192; buf[len++] = 168;
buf[len++] = 4; buf[len++] = 1;
sendto(sock, buf, len, 0,
(struct sockaddr*)&source_addr, socklen);
}
}
}