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, выясните, какой клиент отправил исходный запрос, и ответьте на него. В этой структуре нет места в коде, в котором вы не отвечаете на один из ваших сокетов.

Другие вопросы по тегам