211 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # multicast-dns
 | |
| 
 | |
| Low level multicast-dns implementation in pure javascript
 | |
| 
 | |
| ```
 | |
| npm install multicast-dns
 | |
| ```
 | |
| 
 | |
| [](http://travis-ci.org/mafintosh/multicast-dns)
 | |
| 
 | |
| ## Usage
 | |
| 
 | |
| ``` js
 | |
| var mdns = require('multicast-dns')()
 | |
| 
 | |
| mdns.on('response', function(response) {
 | |
|   console.log('got a response packet:', response)
 | |
| })
 | |
| 
 | |
| mdns.on('query', function(query) {
 | |
|   console.log('got a query packet:', query)
 | |
| })
 | |
| 
 | |
| // lets query for an A record for 'brunhilde.local'
 | |
| mdns.query({
 | |
|   questions:[{
 | |
|     name: 'brunhilde.local',
 | |
|     type: 'A'
 | |
|   }]
 | |
| })
 | |
| ```
 | |
| 
 | |
| Running the above (change `brunhilde.local` to `your-own-hostname.local`) will print an echo of the query packet first
 | |
| 
 | |
| ``` js
 | |
| got a query packet: { type: 'query',
 | |
|   questions: [ { name: 'brunhilde.local', type: 'A', class: 1 } ],
 | |
|   answers: [],
 | |
|   authorities: [],
 | |
|   additionals: [] }
 | |
| ```
 | |
| 
 | |
| And then a response packet
 | |
| 
 | |
| ``` js
 | |
| got a response packet: { type: 'response',
 | |
|   questions: [],
 | |
|   answers:
 | |
|    [ { name: 'brunhilde.local',
 | |
|        type: 'A',
 | |
|        class: 'IN',
 | |
|        ttl: 120,
 | |
|        flush: true,
 | |
|        data: '192.168.1.5' } ],
 | |
|   authorities: [],
 | |
|   additionals:
 | |
|    [ { name: 'brunhilde.local',
 | |
|        type: 'A',
 | |
|        class: 'IN',
 | |
|        ttl: 120,
 | |
|        flush: true,
 | |
|        data: '192.168.1.5' },
 | |
|      { name: 'brunhilde.local',
 | |
|        type: 'AAAA',
 | |
|        class: 'IN',
 | |
|        ttl: 120,
 | |
|        flush: true,
 | |
|        data: 'fe80::5ef9:38ff:fe8c:ceaa' } ] }
 | |
| ```
 | |
| 
 | |
| 
 | |
| # CLI
 | |
| 
 | |
| ```
 | |
| npm install -g multicast-dns
 | |
| ```
 | |
| 
 | |
| ```
 | |
| multicast-dns brunhilde.local
 | |
| > 192.168.1.1
 | |
| ```
 | |
| 
 | |
| # API
 | |
| 
 | |
| A packet has the following format
 | |
| 
 | |
| ``` js
 | |
| {
 | |
|   questions: [{
 | |
|     name: 'brunhilde.local',
 | |
|     type: 'A'
 | |
|   }],
 | |
|   answers: [{
 | |
|     name: 'brunhilde.local',
 | |
|     type: 'A',
 | |
|     ttl: seconds,
 | |
|     data: (record type specific data)
 | |
|   }],
 | |
|   additionals: [
 | |
|     (same format as answers)
 | |
|   ],
 | |
|   authorities: [
 | |
|     (same format as answers)
 | |
|   ]
 | |
| }
 | |
| ```
 | |
| 
 | |
| Currently data from `SRV`, `A`, `PTR`, `TXT`, `AAAA` and `HINFO` records is passed
 | |
| 
 | |
| #### `mdns = multicastdns([options])`
 | |
| 
 | |
| Creates a new `mdns` instance. Options can contain the following
 | |
| 
 | |
| ``` js
 | |
| {
 | |
|   multicast: true // use udp multicasting
 | |
|   interface: '192.168.0.2' // explicitly specify a network interface. defaults to all
 | |
|   port: 5353, // set the udp port
 | |
|   ip: '224.0.0.251', // set the udp ip
 | |
|   ttl: 255, // set the multicast ttl
 | |
|   loopback: true, // receive your own packets
 | |
|   reuseAddr: true // set the reuseAddr option when creating the socket (requires node >=0.11.13)
 | |
| }
 | |
| ```
 | |
| 
 | |
| #### `mdns.on('query', (packet, rinfo))`
 | |
| 
 | |
| Emitted when a query packet is received.
 | |
| 
 | |
| ``` js
 | |
| mdns.on('query', function(query) {
 | |
|   if (query.questions[0] && query.questions[0].name === 'brunhilde.local') {
 | |
|     mdns.respond(someResponse) // see below
 | |
|   }
 | |
| })
 | |
| ```
 | |
| 
 | |
| #### `mdns.on('response', (packet, rinfo))`
 | |
| 
 | |
| Emitted when a response packet is received.
 | |
| 
 | |
| The response might not be a response to a query you send as this
 | |
| is the result of someone multicasting a response.
 | |
| 
 | |
| #### `mdns.query(packet, [cb])`
 | |
| 
 | |
| Send a dns query. The callback will be called when the packet was sent.
 | |
| 
 | |
| The following shorthands are equivalent
 | |
| 
 | |
| ``` js
 | |
| mdns.query('brunhilde.local', 'A')
 | |
| mdns.query([{name:'brunhilde.local', type:'A'}])
 | |
| mdns.query({
 | |
|   questions: [{name:'brunhilde.local', type:'A'}]
 | |
| })
 | |
| ```
 | |
| 
 | |
| #### `mdns.respond(packet, [cb])`
 | |
| 
 | |
| Send a dns response. The callback will be called when the packet was sent.
 | |
| 
 | |
| ``` js
 | |
| // reply with a SRV and a A record as an answer
 | |
| mdns.respond({
 | |
|   answers: [{
 | |
|     name: 'my-service',
 | |
|     type: 'SRV',
 | |
|     data: {
 | |
|       port: 9999,
 | |
|       weight: 0,
 | |
|       priority: 10,
 | |
|       target: 'my-service.example.com'
 | |
|     }
 | |
|   }, {
 | |
|     name: 'brunhilde.local',
 | |
|     type: 'A',
 | |
|     ttl: 300,
 | |
|     data: '192.168.1.5'
 | |
|   }]
 | |
| })
 | |
| ```
 | |
| 
 | |
| The following shorthands are equivalent
 | |
| 
 | |
| ``` js
 | |
| mdns.respond([{name:'brunhilde.local', type:'A', data:'192.158.1.5'}])
 | |
| mdns.respond({
 | |
|   answers: [{name:'brunhilde.local', type:'A', data:'192.158.1.5'}]
 | |
| })
 | |
| ```
 | |
| 
 | |
| #### `mdns.destroy()`
 | |
| 
 | |
| Destroy the mdns instance. Closes the udp socket.
 | |
| 
 | |
| # Development
 | |
| 
 | |
| To start hacking on this module you can use this example to get started
 | |
| 
 | |
| ```
 | |
| git clone git://github.com/mafintosh/multicast-dns.git
 | |
| npm install
 | |
| node example.js
 | |
| node cli.js $(hostname).local
 | |
| ```
 | |
| 
 | |
| ## License
 | |
| 
 | |
| MIT
 |