From 7a5e3e818228ad36b5ffaa188efc71df0086db10 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 15 Feb 2010 00:58:50 -0700 Subject: [PATCH] Make publishing the content server via mDNS a little more robust --- src/calibre/manual/faq.rst | 2 ++ src/calibre/utils/mdns.py | 41 +++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index a3c5bd32c4..bafc13f388 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -146,6 +146,8 @@ Now you should be able to access your books on your iPhone by opening Stanza. Go Replace ``192.168.1.2`` with the local IP address of the computer running |app|. If you have changed the port the |app| content server is running on, you will have to change ``8080`` as well to the new port. The local IP address is the IP address you computer is assigned on your home network. A quick Google search will tell you how to find out your local IP address. Now click "Save" and you are done. +If you get timeout errors while browsing the calibre catalog in Stanza, try increasing the connection timeout value in the stanza settings. Go to Info->Settings and increase the value of Download Timeout. + How do I use |app| with my Android phone? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/calibre/utils/mdns.py b/src/calibre/utils/mdns.py index 033b903e11..8ccdd75e33 100644 --- a/src/calibre/utils/mdns.py +++ b/src/calibre/utils/mdns.py @@ -3,46 +3,59 @@ __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import socket +import socket, time _server = None -def get_external_ip(): +def _get_external_ip(): 'Get IP address of interface used to connect to the outside world' try: ipaddr = socket.gethostbyname(socket.gethostname()) except: ipaddr = '127.0.0.1' if ipaddr == '127.0.0.1': - try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(('google.com', 0)) - ipaddr = s.getsockname()[0] - except: - pass + for addr in ('192.0.2.0', '198.51.100.0', 'google.com'): + try: + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect((addr, 0)) + ipaddr = s.getsockname()[0] + if ipaddr != '127.0.0.1': + return ipaddr + except: + time.sleep(0.3) return ipaddr +_ext_ip = None +def get_external_ip(): + global _ext_ip + if _ext_ip is None: + _ext_ip = _get_external_ip() + return _ext_ip + def start_server(): global _server if _server is None: from calibre.utils.Zeroconf import Zeroconf - _server = Zeroconf() + _server = Zeroconf(bindaddress=get_external_ip()) return _server def publish(desc, type, port, properties=None, add_hostname=True): ''' Publish a service. - + :param desc: Description of service :param type: Name and type of service. For example _stanza._tcp :param port: Port the service listens on - :param properties: An optional dictionary whose keys and values will be put - into the TXT record. + :param properties: An optional dictionary whose keys and values will be put + into the TXT record. ''' port = int(port) server = start_server() - hostname = socket.gethostname().partition('.')[0] if add_hostname: + try: + hostname = socket.gethostname().partition('.')[0] + except: + hostname = 'Unknown' desc += ' (on %s)'%hostname local_ip = get_external_ip() type = type+'.local.' @@ -53,7 +66,7 @@ def publish(desc, type, port, properties=None, add_hostname=True): properties=properties, server=hostname+'.local.') server.registerService(service) - + def stop_server(): global _server if _server is not None: