我想在C中构建一个简单的DNS代理,它接受来自UDP端口53的DNS查询,将查询转发到谷歌的DNS服务器TCP端口53进行查找,然后返回谷歌提供的答案。
是的,这是一个学校项目,我很困惑,我不知道从哪里开始。
感谢您的帮助!!
答案 0 :(得分:3)
你很满意这些要求 - 因为你要从UDP开始 - > TCP,它实际上比做UDP简单得多 - > UDP。
具体来说,我的意思是因为面向外的一侧使用的是连接定向的套接字,所以您立即知道您收到的响应必须与您刚刚发送的查询有关,只要您为每个查询使用新的TCP套接字。
如果外向一侧是UDP,那么找出每个响应与哪个查询相关就变得困难得多 - 在协议中无法保证响应以与查询相同的顺序到达。
如果不需要多线程,那么(在伪代码中)
"open" a UDP socket
"bind" that socket to port 53
while (true) {
"recvfrom" a packet from the UDP socket
... and remember the address it was received from
"open" a TCP socket
"connect" it to Google's DNS
"write" the length of the original query (two bytes, network order - RFC 1035)
"write" the contents of the original query
"read" a two byte length header
"read" that many bytes from the TCP socket
"close" the TCP socket
"sendto" those bytes back over the UDP socket to the original client address
}
答案 1 :(得分:2)
首先,您需要选择一个API来将消息写入网络。 对于Windows,您有Winsock API。 对于类似unix的系统,你有BSD Sockets API 虽然大多数课程都使用BSD API。
现在您的步骤可能是: