diff --git a/include/dns_packet_buffer.h b/include/dns_packet_buffer.h new file mode 100644 index 0000000..f23287d --- /dev/null +++ b/include/dns_packet_buffer.h @@ -0,0 +1,13 @@ +#pragma once +#include + +#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); diff --git a/include/packets.h b/include/dns_packets.h similarity index 99% rename from include/packets.h rename to include/dns_packets.h index ab100de..f4a1ac8 100644 --- a/include/packets.h +++ b/include/dns_packets.h @@ -2,7 +2,7 @@ #include -struct Header { +struct DNSPacketHeader { /* * ID (Packet Identifier) * a random ID is assigned to query packets. diff --git a/include/dns_request.h b/include/dns_request.h new file mode 100644 index 0000000..aeecf54 --- /dev/null +++ b/include/dns_request.h @@ -0,0 +1,7 @@ +#pragma once + +#include "dns_packets.h" + +struct DNSRequest { + struct DNSPacketHeader header; +}; diff --git a/include/packet_buffer.h b/include/packet_buffer.h deleted file mode 100644 index a8564dd..0000000 --- a/include/packet_buffer.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include - -#define PACKET_BUFFER_SIZE 512 - -struct PacketBuffer { - char buf[PACKET_BUFFER_SIZE]; - size_t pos; -}; - -struct PacketBuffer *new_packet_buffer(); diff --git a/include/udp_server.h b/include/udp_server.h new file mode 100644 index 0000000..cd63cfc --- /dev/null +++ b/include/udp_server.h @@ -0,0 +1,5 @@ +#pragma once + +#define UDP_PORT 53 + +int start_server(); diff --git a/src/dns_packet_buffer.c b/src/dns_packet_buffer.c new file mode 100644 index 0000000..55fe986 --- /dev/null +++ b/src/dns_packet_buffer.c @@ -0,0 +1,14 @@ +#include "dns_packet_buffer.h" +#include + +struct DNSPacketBuffer *new_dns_packet_buffer() +{ + struct DNSPacketBuffer *buf; + buf = malloc(sizeof(struct DNSPacketBuffer)); + return buf; +} + +struct DNSPacketHeader *dns_header(struct DNSPacketBuffer) +{ + +} diff --git a/src/dns_request.c b/src/dns_request.c new file mode 100644 index 0000000..243502c --- /dev/null +++ b/src/dns_request.c @@ -0,0 +1,3 @@ +#include "dns_request.h" + + diff --git a/src/main.c b/src/main.c index 4677814..cf152d6 100644 --- a/src/main.c +++ b/src/main.c @@ -1,11 +1,13 @@ #include -#include "packet_buffer.h" + +#include "udp_server.h" int main() { - struct PacketBuffer *buf = new_packet_buffer(); - - printf("size: %ld\n", sizeof(buf->buf)); + if (start_server() != 0) { + perror("couldn't start UDP server"); + return 1; + } return 0; } diff --git a/src/packet_buffer.c b/src/packet_buffer.c deleted file mode 100644 index 1826a6f..0000000 --- a/src/packet_buffer.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "packet_buffer.h" -#include - -struct PacketBuffer *new_packet_buffer() -{ - struct PacketBuffer *buf; - buf = malloc(sizeof(struct PacketBuffer)); - return buf; -} diff --git a/src/udp_server.c b/src/udp_server.c new file mode 100644 index 0000000..d7576ca --- /dev/null +++ b/src/udp_server.c @@ -0,0 +1,47 @@ +#include "udp_server.h" +#include "dns_packet_buffer.h" + +#include +#include +#include +#include +#include +#include +#include + +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; +}