diff options
| author | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 06:10:24 +0000 |
|---|---|---|
| committer | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 06:10:24 +0000 |
| commit | 2f10e3ad86390ab452c2c3a2128c41d515f76e7d (patch) | |
| tree | 72f792c9e36033a1bcbfe801b4a78042bea1f05a /app/forwarder.go | |
| parent | 8659adcd1500f8e199ccef1c255130327a7597f2 (diff) | |
| download | dns-server-go-master.tar.gz dns-server-go-master.zip | |
Diffstat (limited to 'app/forwarder.go')
| -rw-r--r-- | app/forwarder.go | 60 |
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 +} |