aboutsummaryrefslogtreecommitdiff
path: root/app/forwarder.go
diff options
context:
space:
mode:
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
+}