0

我在 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) 时收到另一个请求怎么办?如何添加一些等待请求的队列?即使我正在处理另一个请求,如何改变我为每个请求提供服务的这一点?

4

2 回答 2

0

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

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

于 2012-11-18T15:59:15.403 回答
0

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

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

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

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

您将在此处找到详细示例(它适用于 Linux,但易于移植)。

于 2012-11-18T16:31:27.590 回答