Esempio n. 1
0
def main():
    server = MediaPlayersControlServer(
            (settings.SERVER_ADDR, settings.SERVER_PORT))
    server.start()
    bonjour_server = BonjourServer(settings.SERVICE_NAME,
            settings.SERVICE_REG_TYPE, server.server_port)
    bonjour_server.start()
    print "Server listening on %s:%s" % (server.server_host,
            server.server_port)
    server.serve_forever()
Esempio n. 2
0
def test_discover():
    ref = {
        "name": "Leechy",
        "regtype": "_leechyremote._tcp.",
        "port": random.randint(4096, 65000),
    }
    greenlets = []

    # Start service
    server = BonjourServer(**ref)
    server.start()
    greenlets.append(server)

    # Browse for service
    data = {
        "name": None,
        "regtype": None,
        "port": None,
    }

    def resolve_callback(fd, flags, interface_index, error_code, name,
                         hosttarget, port, txt_record):
        if error_code == pybonjour.kDNSServiceErr_NoError:        
            data["port"] = port
            for greenlet in greenlets:
                greenlet.kill()

    def resolve(interface_index, name, regtype, reply_domain):
        resolve_fd = pybonjour.DNSServiceResolve(0, interface_index,
                name, regtype, reply_domain, resolve_callback)
        try:
            while True:
                ready = select.select([resolve_fd], [], [])
                if resolve_fd not in ready[0]:
                    raise Exception('Resolve timed out')
                pybonjour.DNSServiceProcessResult(resolve_fd)
        finally:
            resolve_fd.close()

    def browse_callback(fd, flags, interface_index, error_code, name,
                        regtype, reply_domain):
        global resolver
        if error_code != pybonjour.kDNSServiceErr_NoError:
            raise Exception()
        if not (flags & pybonjour.kDNSServiceFlagsAdd):
            raise Exception('Service removed')
            return
        data["name"] = name
        data["regtype"] = regtype
        resolver = gevent.spawn(resolve, interface_index, name,
            regtype, reply_domain)
        greenlets.append(resolver)

    def browse():
        browse_fd = pybonjour.DNSServiceBrowse(regtype=ref["regtype"],
                callBack = browse_callback)
        try:
            while True:
                ready = select.select([browse_fd], [], [])
                if browse_fd in ready[0]:
                    pybonjour.DNSServiceProcessResult(browse_fd)
        finally:
            browse_fd.close()

    browser = gevent.spawn(browse)
    greenlets.append(browser)

    gevent.joinall(greenlets, raise_error=True)

    for name in ref:
        if ref[name] != data[name]:
            raise AssertionError("%s != %r, got %r" % 
                    (name, ref[name], data[name]))