refactor initial code and accept a UDP request
This commit is contained in:
parent
fb762b2aef
commit
ee64c84ea4
10 changed files with 96 additions and 25 deletions
13
include/dns_packet_buffer.h
Normal file
13
include/dns_packet_buffer.h
Normal 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);
|
||||||
|
|
@ -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
7
include/dns_request.h
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "dns_packets.h"
|
||||||
|
|
||||||
|
struct DNSRequest {
|
||||||
|
struct DNSPacketHeader header;
|
||||||
|
};
|
||||||
|
|
@ -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
5
include/udp_server.h
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define UDP_PORT 53
|
||||||
|
|
||||||
|
int start_server();
|
||||||
14
src/dns_packet_buffer.c
Normal file
14
src/dns_packet_buffer.c
Normal 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
3
src/dns_request.c
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#include "dns_request.h"
|
||||||
|
|
||||||
|
|
||||||
10
src/main.c
10
src/main.c
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
47
src/udp_server.c
Normal 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;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue