C - DNS прокси обслуживает каждый запрос в любое время
Я создал DNS-прокси в C так:
"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 ответа
Вам нужно listen()
на сокете сервера, и listen
позволяет указать отставание соединений. Вы сможете обрабатывать до этого числа новых прибытий клиентов за цикл.
Тогда вы циклически запускаете select()
на сокете сервера и любых незавершенных клиентских сокетах, ведя их список:
select(nfds, readfds, writefds, errorfds, timeout);
когда select
выходы (если не истекло время ожидания) вы осмотрите три списка возврата и обработаете все сокеты, готовые для чтения, записи или в состоянии ошибки, и отправите их соответствующим образом.
Вы найдете подробный пример здесь (это для Linux, но легко переносимый).
Использование неблокирующих сокетов было бы полезно только в том случае, если вы задали свой сервис асинхронным, то есть не ожидали ответа на исходящий DNS-запрос, а затем ожидали получения другого пакета, поступающего из нисходящего.
Вы должны рассмотреть select
Используя оба сокета, и когда приходит пакет, вы выясняете, откуда он пришел. Если это из нисходящего потока, вы отправляете запрос в вышестоящий DNS; если это ответ от DNS, выясните, какой клиент отправил исходный запрос, и ответьте на него. В этой структуре нет места в коде, в котором вы не отвечаете на один из ваших сокетов.