C - DNS代理随时为每个请求提供服务

时间:2012-11-18 15:35:09

标签: c dns udp nonblocking

我在C中创建了DNS代理:

"socket" - create socket to serve client
"bind" - bind that socket
while (true) {
    "recvfrom" - a package from socket 
    "socket" - create socket for dns server
    (1)
    "sendto" - send package to dns server
    "recvfrom" - respond from dns server
    "sendto" - send respond to client
}

它正在运作。但是如果我在第(1)位时得到另一个请求怎么办?如何在等待请求中添加一些队列?即使我正在为另一个请求工作,如何改变我的服务?

2 个答案:

答案 0 :(得分:0)

使用非阻塞套接字只有在将服务编写为异步时才有用,即在等待来自下游的另一个数据包之前不等待对上游DNS查询的响应。

你应该考虑select这两个套接字,当一个数据包进入时,你会发现它来自哪里。如果它来自下游,则向DNS上游发送请求;如果是来自DNS的响应,请找出哪个客户端发送了原始请求并在那里做出响应。在该结构中,代码中没有您对其中一个套接字没有响应的位置。

答案 1 :(得分:0)

您需要在服务器套接字上listen()listen允许您指定积压的连接。您将能够在每个周期处理最多数量的新客户端到货。

然后在服务器套接字和任何未完成的客户端套接字上循环运行select(),维护它们的列表:

   select(nfds, readfds, writefds, errorfds, timeout);

select退出时(除非它超时)你将检查三个返回列表并处理任何准备好读,写或处于错误状态的套接字,并适当地发送它们。

你会找到一个详细的例子here(它适用于Linux,但很容易移植)。