我在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)位时得到另一个请求怎么办?如何在等待请求中添加一些队列?即使我正在为另一个请求工作,如何改变我的服务?
答案 0 :(得分:0)
使用非阻塞套接字只有在将服务编写为异步时才有用,即在等待来自下游的另一个数据包之前不等待对上游DNS查询的响应。
你应该考虑select
这两个套接字,当一个数据包进入时,你会发现它来自哪里。如果它来自下游,则向DNS上游发送请求;如果是来自DNS的响应,请找出哪个客户端发送了原始请求并在那里做出响应。在该结构中,代码中没有您对其中一个套接字没有响应的位置。
答案 1 :(得分:0)
您需要在服务器套接字上listen()
,listen
允许您指定积压的连接。您将能够在每个周期处理最多数量的新客户端到货。
然后在服务器套接字和任何未完成的客户端套接字上循环运行select()
,维护它们的列表:
select(nfds, readfds, writefds, errorfds, timeout);
当select
退出时(除非它超时)你将检查三个返回列表并处理任何准备好读,写或处于错误状态的套接字,并适当地发送它们。
你会找到一个详细的例子here(它适用于Linux,但很容易移植)。