refactor initial code and accept a UDP request

This commit is contained in:
Piper Pentagram 2025-07-08 13:03:11 -07:00
parent fb762b2aef
commit ee64c84ea4
10 changed files with 96 additions and 25 deletions

View file

@ -0,0 +1,13 @@
#pragma once
#include <stddef.h>
#define PACKET_BUFFER_SIZE 512
struct DNSPacketBuffer {
char buf[PACKET_BUFFER_SIZE];
size_t pos;
};
struct DNSPacketBuffer *new_dns_packet_buffer();
struct DNSPacketHeader *dns_header(struct DNSPacketBuffer);

View file

@ -2,7 +2,7 @@
#include <stddef.h> #include <stddef.h>
struct Header { struct DNSPacketHeader {
/* /*
* ID (Packet Identifier) * ID (Packet Identifier)
* a random ID is assigned to query packets. * a random ID is assigned to query packets.

7
include/dns_request.h Normal file
View file

@ -0,0 +1,7 @@
#pragma once
#include "dns_packets.h"
struct DNSRequest {
struct DNSPacketHeader header;
};

View file

@ -1,11 +0,0 @@
#pragma once
#include <stddef.h>
#define PACKET_BUFFER_SIZE 512
struct PacketBuffer {
char buf[PACKET_BUFFER_SIZE];
size_t pos;
};
struct PacketBuffer *new_packet_buffer();

5
include/udp_server.h Normal file
View file

@ -0,0 +1,5 @@
#pragma once
#define UDP_PORT 53
int start_server();

14
src/dns_packet_buffer.c Normal file
View file

@ -0,0 +1,14 @@
#include "dns_packet_buffer.h"
#include <stdlib.h>
struct DNSPacketBuffer *new_dns_packet_buffer()
{
struct DNSPacketBuffer *buf;
buf = malloc(sizeof(struct DNSPacketBuffer));
return buf;
}
struct DNSPacketHeader *dns_header(struct DNSPacketBuffer)
{
}

3
src/dns_request.c Normal file
View file

@ -0,0 +1,3 @@
#include "dns_request.h"

View file

@ -1,11 +1,13 @@
#include <stdio.h> #include <stdio.h>
#include "packet_buffer.h"
#include "udp_server.h"
int main() int main()
{ {
struct PacketBuffer *buf = new_packet_buffer(); if (start_server() != 0) {
perror("couldn't start UDP server");
printf("size: %ld\n", sizeof(buf->buf)); return 1;
}
return 0; return 0;
} }

View file

@ -1,9 +0,0 @@
#include "packet_buffer.h"
#include <stdlib.h>
struct PacketBuffer *new_packet_buffer()
{
struct PacketBuffer *buf;
buf = malloc(sizeof(struct PacketBuffer));
return buf;
}

47
src/udp_server.c Normal file
View file

@ -0,0 +1,47 @@
#include "udp_server.h"
#include "dns_packet_buffer.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int start_server()
{
struct DNSPacketBuffer *pb = new_dns_packet_buffer();
struct sockaddr_in servaddr = {0};
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
perror("failed to create socket");
return -1;
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(UDP_PORT);
servaddr.sin_addr.s_addr = INADDR_ANY;
int rc = bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr));
if (rc == -1)
{
perror("failed to bind");
close(sockfd);
return -1;
}
socklen_t len = 0;
int n = recvfrom(sockfd, (char *)pb->buf, sizeof(pb->buf), MSG_WAITALL, 0, &len);
printf("%s", pb->buf);
close(sockfd);
return 0;
}