[Twisted-Python] Finding peers.

Tim Allen screwtape at froup.com
Mon Jul 7 07:38:38 MDT 2003


On Sunday, Jul 6, 2003, at 23:59 Australia/Sydney, Jody Winston wrote:
> I'm also interested in using Rendezvous in twisted.  I don't have much
> time at the present to both learn Rendezvous and the internals of
> twisted but I'll pass on two links if you haven't seen them.  The
> first link is http://dotlocal.org/ and they are "Software developers
> interested in implementing zeroconf, multicast dns and dns service
> discovery".  The second link is a Python implementation of Rendezvous,
> PyRendezvous, which can be found at..
> http://radio.weblogs.com/0105002/stories/2003/01/06/ 
> multicastDnsServiceDiscoverForPython.html

I just spend a day or so reading about ZeroConf and Twisted's DNS  
support, and hacking together the attached code.

The quick, quick summary is this: ZeroConf has two important parts:  
DNS-SD and mDNS.

DNS-SD (DNS based Service Discovery) is the easy part - it's just a  
standard way of organising DNS records such that a set of DNS queries  
can create a useful list of things to connect to. 'Implementing' DNS-SD  
support is not at all difficult, providing there exists an API to  
request PTR and SRV records, and providing you can add them to your DNS  
server.

mDNS (Multicast DNS) is more complex, and seems to require  
operating-system cooperation. Regular DNS queries to the magic address  
224.0.0.251 on port 5353 UDP are declared to be multicast queries, and  
link-local. Also, any attempt to resolve any address ending in '.local'  
should be done via multicast. With multicast DNS come some different (I  
think - I don't know DNS all that well) behaviours:
	- When you send a request that you've already got a reply for, you  
should include the
	  list of names you already have, so those services know not to  
respond a second time.
	- Single requests can have multiple replies.
	- You can have a 'continuous request'.

I haven't read the mDNS spec in detail, but the interaction between  
Twisted and the operating system's resolver seems complex. It'd be nice  
if Python had a DNS API more extensive than gethostbyname(), but it  
doesn't.

The attached files are a first draft at a DNS-SD client library for  
Twisted. dns_sd.py contains the meat, and dns_st_client.py is a thin  
wrapper based on doc/examples/dns-service.py dns_sd.py also contains a  
quick hack to make Twisted.Names issue mDNS requests. The end result is  
that on my Powerbook G4 running Mac OS X 10.2.6, I get the following  
output:

$ ./dns_sd_client.py http tcp local
{'instance': u"Tim Allen's Web Site",
  'servers': [('grundoon.local', 80)],
  'serviceInstance': "Tim Allen's Web Site._http._tcp.local",
  'settings': {'path': '/~st/'}}
{'instance': u'Grundoon',
  'servers': [('grundoon.local', 80)],
  'serviceInstance': 'Grundoon._http._tcp.local',
  'settings': {}}

Note that my laptop's name is 'grundoon' and my login name is 'st'.

The only obvious wart in the code as it stands is that the spec says  
that the 'instance' name can contain any Unicode character, while  
Twisted's DNS code seems to choke on DNS name components that contain  
periods. For the record, the DNS-SD spec says that embedded periods  
should be written '\.', and backslashes obviously '\\'.

It occurs to me now that perhaps I should have written a patch for the  
Twisted DNS code and submitted it along with this message, but it's  
getting late and I wish to get some sleep before I go to work tomorrow.  
:)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: dns_sd.py
Type: application/octet-stream
Size: 6757 bytes
Desc: not available
URL: </pipermail/twisted-python/attachments/20030707/26bfc172/attachment-0004.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dns_sd_client.py
Type: application/octet-stream
Size: 598 bytes
Desc: not available
URL: </pipermail/twisted-python/attachments/20030707/26bfc172/attachment-0005.obj>


More information about the Twisted-Python mailing list