-
-
Save wallrj/87ba789dfc00d35d2307 to your computer and use it in GitHub Desktop.
A simple multi cpu twisted dns server on a single ip/port.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import multiprocessing | |
import os | |
import socket | |
import time | |
from twisted.python.components import proxyForInterface | |
from twisted.internet.interfaces import IResolver | |
from twisted.names import dns, root, server | |
class PrintingResolver(proxyForInterface(IResolver)): | |
def __init__(self, original): | |
self.original = original | |
def query(self, *args, **kwargs): | |
print "QUERY IN CHILD", os.getpid() | |
time.sleep(0.1) | |
return self.original.query(*args, **kwargs) | |
def startChild(socketFD, socketFamily): | |
from twisted.internet import reactor | |
rootAddresses = [ | |
socket.gethostbyname(d + '.root-servers.net') | |
for d in 'abcdefghijklm'] | |
s = server.DNSServerFactory( | |
clients=[ | |
PrintingResolver( | |
root.Resolver( | |
hints=rootAddresses, | |
reactor=reactor))]) | |
p = dns.DNSDatagramProtocol(controller=s, reactor=reactor) | |
reactor.adoptDatagramPort(socketFD, socketFamily, p) | |
reactor.run() | |
raise SystemExit() | |
def main(): | |
print "PARENT", os.getpid() | |
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
sock.setblocking(False) | |
sock.bind(('127.0.0.1', 10053)) | |
childpids = [] | |
for i in range(min(multiprocessing.cpu_count(), 2)): | |
pid = os.fork() | |
if pid == 0: | |
startChild(sock.fileno(), socket.AF_INET) | |
else: | |
print "CHILD", pid | |
childpids.append(pid) | |
for pid in childpids: | |
os.waitpid(pid, 0) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment