aboutsummaryrefslogtreecommitdiff
path: root/app/forwarder.go
diff options
context:
space:
mode:
authorjet2tlf <jet2tlf@gmail.com>2024-06-03 06:10:24 +0000
committerjet2tlf <jet2tlf@gmail.com>2024-06-03 06:10:24 +0000
commit2f10e3ad86390ab452c2c3a2128c41d515f76e7d (patch)
tree72f792c9e36033a1bcbfe801b4a78042bea1f05a /app/forwarder.go
parent8659adcd1500f8e199ccef1c255130327a7597f2 (diff)
downloaddns-server-go-master.tar.gz
dns-server-go-master.zip
codecrafters submit [skip ci]HEADmaster
Diffstat (limited to 'app/forwarder.go')
-rw-r--r--app/forwarder.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/app/forwarder.go b/app/forwarder.go
new file mode 100644
index 0000000..c4eac58
--- /dev/null
+++ b/app/forwarder.go
@@ -0,0 +1,60 @@
+package main
+
+import (
+ "fmt"
+ "net"
+)
+
+func ForwardQuestions(addr string, questions []DNSQuestion, id uint16) []DNSAnswer {
+ answers := []DNSAnswer{}
+
+ udpConn, err := net.Dial("udp", addr)
+ if err != nil {
+ fmt.Println("Failed to connect to address:", err)
+ return answers
+ }
+
+ defer udpConn.Close()
+
+ for _, question := range questions {
+ questionBytes := question.Bytes()
+
+ header := DNSHeader{
+ ID: id,
+ QR: 0,
+ OPCODE: 0,
+ AA: 0,
+ TC: 0,
+ RD: 1,
+ RA: 0,
+ Z: 0,
+ RCODE: 0,
+ QDCOUNT: 1,
+ ANCOUNT: 0,
+ NSCOUNT: 0,
+ ARCOUNT: 0,
+ }
+
+ headerBytes := header.Bytes()
+ buf := append(headerBytes, questionBytes...)
+
+ _, err = udpConn.Write(buf)
+ if err != nil {
+ fmt.Println("Failed to send data:", err)
+ return answers
+ }
+
+ responseBuf := make([]byte, 512)
+
+ n, err := udpConn.Read(responseBuf)
+ if err != nil {
+ fmt.Println("Failed to receive data:", err)
+ return answers
+ }
+
+ responseHeader := ParseHeader(responseBuf[:n])
+ answers = append(answers, ParseAnswers(responseBuf[:n], responseHeader.QDCOUNT, responseHeader.ANCOUNT)...)
+ }
+
+ return answers
+}