コード例 #1
0
def QueryCallback(sdRef,flags,interfaceIndex,
                    errorCode,fullname,rrtype,
                    rrclass,rdlen,rdata,
                    ttl,userdata):
    # This is very ugly; should understand resource records better
    st = struct.unpack('%dc' % (rdlen-1), rdata)
    l1 = ord(st[0])
    l2 = ord(st[l1+1])
    typ = ''.join(st[1:l1+1])
    klass = ''.join(st[l1+2:l1+l2+2])
    serviceType = typ + '.' + klass

    if flags & SERVICE_ADD:
    
        # Add the service type to the browser
        app.frame.AddServiceType(serviceType)

        serviceRef = bonjour.AllocateDNSServiceRef()
        ret = bonjour.pyDNSServiceBrowse(  serviceRef,   # DNSServiceRef         *sdRef,
                                      0,                    # DNSServiceFlags       flags,                        
                                      0,                    # uint32_t              interfaceIndex,               
                                      serviceType,          # const char            *regtype,                     
                                      'local.',             # const char            *domain,    /* may be NULL */ 
                                      BrowseCallback,       # DNSServiceBrowseReply callBack,    
                                      None)                 
        if ret:
            print "ret = %d; exiting" % ret
            sys.exit(1)
        fd = bonjour.DNSServiceRefSockFD(serviceRef)
        serviceRefDict[fd] = serviceRef
    elif flags == 0:
        app.frame.RemoveServiceType(serviceType)
コード例 #2
0
    def startResolving(self):
        """Advertise the service with Bonjour.
        
        This method returns a deferred.  Upon success, the result
        is a dictionary of information about the service.  Upon failure,
        the result is a Failure object that knows the BonjourError code.
        """

        # Allocate a Bonjour Service Reference
        self.sdRef = bonjour.AllocateDNSServiceRef()

        # Initiate Registration of the service
        ret = bonjour.pyDNSServiceResolve(self.sdRef, self.flags,
                                          self.interfaceIndex, self.name,
                                          self.regtype, self.domain,
                                          self.callback, self.context)

        # Error check for immediate failure
        if ret != bonjour.kDNSServiceErr_NoError:
            raise BonjourResolveError(ret)

        # Get the file descriptor and integrate with twisted
        self.fd = bonjour.DNSServiceRefSockFD(self.sdRef)
        self.bonjourDesc = BonjourDescriptor(self.fd, self.sdRef)
        self.reactor.addReader(self.bonjourDesc)

        return None
コード例 #3
0
        def __init__(self, serviceName, regtype, url, port=9999):

            if port == 0:
                raise PublisherError(
                    'Service registered with invalid port %d' % (port, ))

            self.serviceRef = None
            self.registerFlag = threading.Event()

            # Create a text record
            txtRecordTxt = 'url=' + url
            txtRecord = chr(len(txtRecordTxt)) + txtRecordTxt
            txtRecordLen = len(txtRecord)

            # Allocate a service discovery reference and register the specified service
            self.serviceRef = bonjour.AllocateDNSServiceRef()
            ret = bonjour.pyDNSServiceRegister(self.serviceRef, 0, 0,
                                               serviceName, regtype, 'local.',
                                               None, port, txtRecordLen,
                                               txtRecord,
                                               self.__RegisterCallback, None)

            if ret != bonjour.kDNSServiceErr_NoError:
                raise PublisherError(ret)

            # Get the socket and loop
            fd = bonjour.DNSServiceRefSockFD(self.serviceRef)
            ret = select.select([fd], [], [])
            if ret[0]:
                ret = bonjour.DNSServiceProcessResult(self.serviceRef)
コード例 #4
0
        def Run(self):

            self.running = 1

            # Allocate a service discovery ref and browse for the specified service type
            self.serviceRef = bonjour.AllocateDNSServiceRef()
            ret = bonjour.pyDNSServiceBrowse(self.serviceRef, 0, 0,
                                             self.serviceType, 'local.',
                                             self.__BrowseCallback, None)
            if ret != bonjour.kDNSServiceErr_NoError:
                print "ret = %d; exiting" % ret
                raise BrowserError('browse', ret)

            # Get socket descriptor
            fd = bonjour.DNSServiceRefSockFD(self.serviceRef)

            if fd <= 0:
                raise BrowserError('fd', fd)

            # Loop
            while self.IsRunning():
                # print "do select"
                ret = select.select([fd], [], [], self.timeout)
                if ret[0]:
                    #print "do process result"
                    ret = bonjour.DNSServiceProcessResult(self.serviceRef)
                    if ret != bonjour.kDNSServiceErr_NoError:
                        raise BrowserError('processresult', ret)
コード例 #5
0
def BrowseServices():

    # Allocate a service discovery ref and browse for the specified service type
    serviceRef = bonjour.AllocateDNSServiceRef()
    ret   = bonjour.pyDNSServiceQueryRecord(serviceRef,
                                        0,  # no flags
                                        0,  # all network interfaces
                                        "_services._dns-sd._udp.local.",  # meta-query record name
                                        PTR_RECORD_TYPE,
                                        INTERNET_CLASS_TYPE, 
                                        QueryCallback,  # callback function ptr
                                        None)
    if ret != bonjour.kDNSServiceErr_NoError:
        print "ret = %d; exiting" % ret
        sys.exit(1)

    # Get socket descriptor and loop                       
    fd = bonjour.DNSServiceRefSockFD(serviceRef)
    while 1:
        ret = select.select([fd],[],[])
        ret = bonjour.DNSServiceProcessResult(serviceRef)

    # Deallocate the service discovery ref
    bonjour.DNSServiceRefDeallocate(serviceRef)
コード例 #6
0
hostname = socket.gethostname()

# Allocate a service discovery reference and register the specified service
serviceRef = bonjour.AllocateDNSServiceRef()
ret = bonjour.pyDNSServiceRegister(
    serviceRef,  # DNSServiceRef           *sdRef,
    0,  # DNSServiceFlags         flags,         /* may be 0 */
    0,  # uint32_t                interfaceIndex,/* may be 0 */
    servicename,  # const char              *name,         /* may be NULL */
    regtype,  # const char              *regtype,
    'local.',  # const char              *domain,       /* may be NULL */
    hostname,  # const char              *host,         /* may be NULL */
    port,  # uint16_t                port,
    0,  # uint16_t                txtLen,
    "",  # const void              *txtRecord,    /* may be NULL */
    RegisterCallback,  # DNSServiceRegisterReply callBack,      /* may be NULL */
    userdata)

if ret != bonjour.kDNSServiceErr_NoError:
    print "error %d returned; exiting" % ret
    sys.exit(ret)

# Get the socket and loop
fd = bonjour.DNSServiceRefSockFD(serviceRef)
while 1:
    ret = select.select([fd], [], [])
    ret = bonjour.DNSServiceProcessResult(serviceRef)

# Deallocate the service discovery ref
bonjour.DNSServiceRefDeallocate(serviceRef)