HelloZeroNet/ZeroNet · error · AnnounceError

Could not connect

Error message

Could not connect

What it means

AnnounceBitTorrentPlugin announces a site's peers via a UDP BitTorrent tracker. announceTrackerUdp calls tracker.connect() then poll_once(); if the first poll returns nothing (no UDP response / connect handshake failed), it raises AnnounceError("Could not connect"). This means the tracker never responded to the initial connection, so the announce cannot proceed.

Solutions

  1. Verify the tracker address is alive (e.g. test with a bittorrent client or dig/nc for the UDP port).
  2. Check local firewall/NAT allows outbound UDP on the tracker port.
  3. Wait and retry — announce is retried periodically and other trackers (AnnounceTrackers plugin) cover failures.
  4. Replace the dead tracker in the site's tracker list.
  5. Check Tor/transparent proxy config is not blocking UDP.

Example fix

// before
tracker.connect()
if not tracker.poll_once():
    raise AnnounceError("Could not connect")
// after
tracker.connect()
if not tracker.poll_once():
    self.site.log.debug("UDP tracker %s unreachable, skipping" % tracker_address)
    return []  # let other trackers handle announce
Defensive patterns

Strategy: retry

Validate before calling

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(5)
try:
    host, port = tracker_address.split(":")
    sock.sendto(b"probe", (socket.gethostbyname(host), int(port)))
    reachable = True
except (socket.error, socket.gaierror):
    reachable = False
finally:
    sock.close()
if not reachable:
    skip_tracker(tracker_address)

Try / catch

try:
    peers = announce_plugin.announceTrackerUdp(tracker_address, file_info)
except AnnounceError as e:
    log.warning("UDP tracker %s failed: %s" % (tracker_address, e))
    peers = []  # other announce plugins will cover

Prevention

When it happens

Trigger: The UDP tracker at the configured tracker address is unreachable or drops packets: tracker domain resolves wrong, UDP traffic blocked by firewall/NAT, tracker offline, or wrong port in the site's tracker list. tracker.poll_once() times out after tracker.connect().

Common situations: Firewalled/censored networks blocking UDP; dead public BitTorrent trackers; trackers configured in site's sites.json that no longer exist; IPv6 vs IPv4 mismatch (getIpType check sets peer_port=0 but tracker still unresponsive).

Related errors


AI-assisted analysis of HelloZeroNet/ZeroNet@454c0b2e7e (2026-09-02). Data as JSON: /api/errors/7d3b062719596667. Report an issue: GitHub.

Appendix: source

Thrown at plugins/AnnounceBitTorrent/AnnounceBitTorrentPlugin.py:61

            handler = super(SiteAnnouncerPlugin, self).getTrackerHandler(protocol)
        return handler

    def announceTrackerUdp(self, tracker_address, mode="start", num_want=10):
        s = time.time()
        if config.disable_udp:
            raise AnnounceError("Udp disabled by config")
        if config.trackers_proxy != "disable":
            raise AnnounceError("Udp trackers not available with proxies")

        ip, port = tracker_address.split("/")[0].split(":")
        tracker = UdpTrackerClient(ip, int(port))
        if helper.getIpType(ip) in self.getOpenedServiceTypes():
            tracker.peer_port = self.fileserver_port
        else:
            tracker.peer_port = 0
        tracker.connect()
        if not tracker.poll_once():
            raise AnnounceError("Could not connect")
        tracker.announce(info_hash=self.site.address_sha1, num_want=num_want, left=431102370)
        back = tracker.poll_once()
        if not back:
            raise AnnounceError("No response after %.0fs" % (time.time() - s))
        elif type(back) is dict and "response" in back:
            peers = back["response"]["peers"]
        else:
            raise AnnounceError("Invalid response: %r" % back)

        return peers

    def httpRequest(self, url):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
            'Accept-Encoding': 'none',
            'Accept-Language': 'en-US,en;q=0.8',

View on GitHub (pinned to 454c0b2e7e)