The Most Efficient Gnutella Client
gtk-gnutella is a server/client for Gnutella. It runs on Microsoft Windows and every Unix-like system which supports GTK+ (1.2 or above). The GNOME desktop environment is not required. It is currently developed and tested under Linux (Debian) as well as NetBSD. It is known to run at least on Linux, FreeBSD, NetBSD, Darwin, Solaris, Tru64 UNIX (OSF/1), SGI IRIX, BeOS whereas CPU architectures include x86, AMD64, PowerPC, SPARC, MIPS. And of course Microsoft Windows (XP at least).
gtk-gnutella is free open-source software and released under the GNU General Public License (GPL).
gtk-gnutella is not finished yet, but it is fully functional: you may share, search, and download. And it is stable too, users usually just leave it run unattended for days.
All ideas and comments are welcome to the gtk-gnutella-devel mailing list. Bugs should be reported to the SourceForge.net Bug Tracker
1 September 2013, Version 1.0.0 Released
This is a major release correcting a few bugs and adding small but interesting features such as the ability to limit dropping of received UDP messages, making the DHT keys and values persistent across sessions, SDBM file auto-compaction at startup, and last but not least, rarest-chunk downloading to optimize download efficiency when facing partial sources.
- Let users define a maximum lease time for UPnP and NAT-PMP mappings.
- Made DHT keys and values persistent across sessions.
- When there are partial sources for a file, download the rarest chunks first.
- [GTK1] Optimize massive updating of the download source list.
- [GTK] Dynamically update the list of available chunks in the file (blue line).
- Files used to persist information across sessions are now auto-compacted.
- The UPnP layer can now monitor more types of Internet Gateway Devices.
- After unclean shutdown, rename existing core file in crash directory.
- Detect servers that choke when receiving pipelined HTTP requests.
- Added the Mersenne Twister Pseudo-Random Number Generator.
- Remember when user requests an auto-restart, to keep the same session going.
- Increased maximum download buffer size to 1 MiB and default to 128 KiB.
- [GTK2] Set height of the pref/upload window (paths to files) to 100 pixels.
- [GTK1] Fixed wrong enum value usage (c_fi_sources instead of c_src_num).
- [GTK] Download source details were incorrect sometimes for queued downloads.
- [GTK] Reserve display of partial file indication (PFS) to partial sources.
- DHT traffic accounting was broken when semi-reliable UDP was introduced.
- Was wrongly keeping orphan DHT contacts and removing alive ones!
- Fixed wrong restarting DB key computation for DHT values (preventing crashes).
- Fixed improper "good" alt-loc flagging from uploaders, leading to wrong mesh.
- Fixed English typos in comments and user-visible messages.
- Avoid selecting the magic fw-fw file index for partial files in query hits.
- Fixed wrong propagation of duplicate messages with higher TTL.
Under the Hood
- Fixed posix_memalign() so that we can now run with glib 2.36 and upwards.
- [GTK] Update available ranges when the core sends a "range changed" event.
- Added UDP datagram read-ahead to minimize local kernel drops (RX queue full).
- Added UDP read-ahead statistics.
- Ensure "DHT values" and "DHT raw data" SDBM files are consistently reloaded.
- Fixed omalloc() memory usage accounting.
- str_at(): fixed harmful typo causing it to seg-fault with negative offsets.
- Do not send X-Features / X-Token on follow-up HTTP requests.
- upnp_dscv_probed(): plugged memory leak.
- UPNP: extract the Service Control Protocol Definition (SCPD) URL.
- UPNP: monitor gateway with GetStatusInfo() if no GetTotalPacketsReceived().
- Some UPnP devices can advertize an API and yet return 401 (action invalid).
- bigkey_hash(): more robust in case we encounter a big key and support is off.
- udp_sched_write_error(): don't panic if we get an unexpected UDP write error.
- Jumbo patch: replaced most gm_[v]snprintf() with str_[v]bprintf() calls.
- Count truncated incoming UDP messages.
- http_got_header(): fixed harmful typo causing mishandling of chunked output.
- After 3 X-Nalt reports, move source from download mesh to the banned mesh.
- Leave banned entries in the bad mesh for at least 5 minutes.
- cq_free(): release mutex to prevent loud warning a shutdown time.
- When the the crash handler child fails, append decorated stack from parent.
- download_data_received(): extend fileinfo when file size is unknown.
- Moved HTTP range parsing / handling from core to library (re-architectured).
- Benchmark sorting routines at startup and select the most efficient.
- socket_udp_flush_timer(): do not process queued datagrams during shutdown.
- Make rand31() more random, especially on the low-order bits.
- Added computation of chi-squared cumulative distributions.
- Made entropy_random() 5 times faster on average.
- Prefer random_value() over random_u32() followed by bit masking.
- The random layer now uses the Mersenne Twister, excepted for random_bytes().
- hash_keyset_lookup(): was not always spotting first tomb correctly.
- Let small hash tables be denser than larger ones.
- Tweaked hash tables and derivatives for smaller memory footprint.
- guess_pmsg_free(): make sure pool does not contain host before adding it back.
- http_send_status(): was not properly detecting too large HTTP headers.
- Semi-reliable RX UDP: re-ack everything well before the whole message expires.
- Adjust maximum DHT value count per IP/network dynamically with DHT size.
- Be careful when truncating body on an HTTP kept-alive connection.
- ensure_unicity(): assume pidfile is locked when lock owner bears our PID.
- Added protection when writing important files on filesystems like "ext4".
- PARQ: accept to move an upload to the "dead" queue even if we wait for QUEUE.
- Made GTK2 the default GTK version since GTK1 is not 64-bit safe.
11 November 2012, Version 0.98.4 Released
This is an important release correcting severe bugs affecting the overall wealth of the system: the PARQ upload queue was not properly restored, the DHT was not always sending correct values back (resulting in failed lookups), and SDBM (our hash-on-disk database) had two well-hidden bugs that could cause crashes at startup or that compromised regular runtime operations.
This release also introduces an interesting improvement: we are now using a reliable UDP layer to transfer out-of-band query hits, ensuring that these important messages are properly sent and received and never lost.
The SPAM-detection on query hits received via UDP was too eager to discard results from perfectly valid sources, causing improper loss of results from your queries.
We were also wrongly sending out more queries than necessary: a long-standing bug caused locally-issued OOB-proxied queries to be re-emitted a second time, and we were re-forwarding duplicate queries (received with higher TTL than before) to all the leaves. Although not harmful, these two bugs were wasting some of the outgoing bandwidth when running as a ultra node.
- Plugged support for "OOB Proxy Veto".
- Added a Semi-Reliable UDP layer for Gnutella for safe OOB hit delivery.
- Report and display available file size when handling hits for partial files.
- Added French and Turkish translations of the FAQ.
- Updated French and Turkish translations.
- Fixed typo in a German translation.
- Cleanup of the English FAQ, updating obsolete answers.
- [GTK] Show different icon and tooltip when port mapping done through NAT-PMP.
- [GTK] Flag results from servents with a banned GUID in the "Info" column.
- [GTK] Windows version now compiled with GTK 2.24.10.
- Non-sharing servents can now be promoted to ultra peers (in automatic mode).
- Be stricter about vendor messages origin: ignore them if from wrong protocol.
- Strip GGEP "NP" key from relayed queries.
- Use higher-priority UDP messages for important or time-sensitive data.
- Use semi-reliable UDP to transfer critical data (query hits).
- Make sure the queries we OOB-proxy have a GGEP "SO" key for secure OOB hits.
- Ignore unsecure OOB hit promises from hosts known to support secure OOB.
- Use some of our connected ultra nodes when filling UHC pongs.
- Updated GeoIP databases.
- When resuming from crashes, do not stop session-only searches.
- Persist selected search media types from session to session.
- Report last modification time + available size of partial files in hits.
- Added "webm" and "zoo" to the list of file extensions that can be shared.
- Display unexpected command-line argument before usage output.
- The shell "status" command now shows how port mapping was done, if any.
- Do not forward "What's New?" queries to leaf nodes with empty routing tables.
- Avoid segmentation fault if GUESS 0.2 cache is empty.
- Avoid SDBM crash when clearing database which had big keys/values present.
- Use signed arithmetic to compute compression ratios.
- Consider x.x.x.0 as a possibly valid IPv4 address.
- Was not correctly parsing the saved PARQ queue, causing undue forgetting.
- Fixed key accounting in DBMW.
- SDBM was sometimes not iterating over unflushed dirty LRU pages.
- Fixed wrong DHT value response message format.
- Fixed crash when attempting to browse host on a queued source.
- Do not route duplicate queries with higher TTL to leaves.
- Prevent sending of duplicate (locally issued) OOB-proxied queries.
- Fixed startup crash bug on Ubuntu machines.
- Changed the Debian menu icon to use the one which is 32x32, as lintian wants.
- Fixed auto-restart function on 64-bit Windows.
Under the Hood
- [GTK] Darken the color used to display partial results (yellow -> dark gold).
- Various PARQ cleanup to smooth QUEUE callback operations.
- Fallback to pre-computed symbol file when loaded symbols are garbage.
- Relax file_path_set() and open_read() to gracefully handle relative paths.
- get_folder_basepath(): protect against unsuitable environment variables.
- Recompute the amount of banned fds dynamically as config parameters change.
- Detect series of unclaimed OOB hits from a host to ignore further queries.
- Changed MUID marking strategy in queries to better accomodate OOB proxying.
- Added a UDP TX scheduler to optimize datagram sending by priority.
- Enhanced the incremental zlib operations, reusing objects across operations.
- Added new official ISO 3166 country codes.
- node_read(): was wrongly resizing the message buffer for each message!
- Refactored aging table to lower memory footprint (by 6 pointers per entry).
- On Windows, keep last 3 stdout/stderr logs, created when launched from GUI.
- Send important UDP messages with a "control" priority.
- Count TCP push-proxy requests aimed at firewalled-to-firewalled connections.
- Patch UDP PUSH messages aimed at initiating firewall-to-firewall transfers.
- Count received PUSHes requesting FW-FW transfers, plus those targeting us.
- dht_init(): do not reset the KUID if DHT disabled at startup.
- Detect whether we are restarting after a clean shutdown or after a crash.
- bg_task_terminate(): don't panic at shutdown when handling unaccounted tasks.
- Reserve only about 40% of the available virtual memory space on Windows.
- Always discover port-mapping devices, even if they won't be used.
- Ensure reasonable TTL and hops for PUSH messages from UDP we will route.
- The shell "nodes" command now displays the gnet port along with the address.
- Added metaconfig check for malloc() superseding.
- New switch --disable-malloc added to build.sh to prevent superseding malloc().
- When launching gdb during crash, ask for threads and thread stacks as well.
- External IP changes were not waiting for 3 hosts in 3 different CIDR ranges.
- Removed too restrive permissions in the man page (COPYRIGHT section).
- Shell meta-chars in executable path do not prevent loading symbols via BFD.
- Added more DHT statistics.
4 June 2012, Version 0.98.3 Released
- [GTK] Added per-search GUESS statistics line, which can be hidden by users.
- [GTK] Display amount of downloads associated with search in the search label.
- Added property to control usage of unused Gnutella bandwidth by GUESS.
- Added "memory check xmalloc" shell command to monitor the xmalloc freelists.
- On Windows, generate a gdb-like stack trace in the crash log file.
- [GTK] Optimized rendering of main statistics page.
- [GTK] Show more accurate message for queued downloads on completed files.
- Shell now displays properties with appropriate surrounding type markers.
- Limit pongs sent to transient nodes in order to save some bandwidth.
- Avoid sending too many pongs on uncompressed connections.
- Added README.Windows to document compile instructions for Windows.
- Avoid "write() failed: EPIPE" messages from the shell for local client writes.
- Added GUESS link cache size to the general statistics pane.
- GUESS now uses a dynamically computed outgoing bandwidth limit.
- Allow failed TLS connections to be retried without TLS, transparently.
- Added "-a" switch to the shell "version" command to display glib/GTK/TLS info.
- Added -p switch to the "stats" shell command to pretty-print numbers.
- Memory optimization of commonly used data structures to reduce footprint.
- Always generate a crashlog file, even when dumping a core.
- PARQ: switch actively queued download to another when file has been completed.
- Attempt to immediately restart download after failed SHA1 + TTH verification.
- At startup, compute TTH if available and SHA1 checking failed.
- When switching PARQ 1.0 downloads, switch IDs if queue position is favorable.
- Updated translation strings, and fixed French translation.
- bug #3286824 "Crash at startup / 0.96.9 / FreeBSD AMD64"
- Fixed %G formatting bug whereby a zero following a dot would be missed.
- Prevent auto-restart when they explicitly request a shutdown.
- Fixed grave bugs in the virtual memory layer, some being Windows-specific.
- PARQ was not properly computing amortized per-slot time.
- Avoid random shell connection failures on Windows.
- An un-parseable token in a shell command led to an assertion failure.
- Fixed the "alignment optimized" code branch of msort_with_tmp().
- Fixed bad copy-n-paste that could lead to malloc() freelist corruption.
- Fixed GUESS corner-case crash when handling an RPC timeout.
- [GTK] Avoid crash when user clears the upload statistics (bug #3501181).
- On Windows, be smarter when reserving the initial amount of virtual space.
- GUESS: always wakeup sleeping queries if we have bandwidth.
Under the Hood
- Improved thread-safety of the VMM layer.
- Removed perl4-ism in Perl scripts.
- Updated IPv4 and IPv6 geo databases.
- Attempt to drive a deadlock crash as far as possible to collect debug info.
- When logging from another thread (not main), include the small thread ID.
- Switched halloc() to xpmalloc() instead of walloc().
- Added thread-private zones for blocks <= 512 bytes for faster allocations.
- Optimized access to thread-private information, via a lock-free fast path.
- Exit with a zero status when terminating through a regular signal or request.
- Some UTF-8 optimizations and low-level fixes.
- Also log the faulting PC when we get a harmful signal.
- Use the BFD library, if available, to extract symbols from the executable.
- Restored ability to have usable stack unwinding on Windows.
- Extended crash log information to include full OS name and CPU architecture.
- Sort SHA1s in the search.xml file.
- Clear whole routing table when switching between Ultra and Leaf modes.
- Protect xfree() from algorithmic complexity when handling bursts.
- Added xmalloc garbage collector to reclaim fragments from freelist.
- Allow the "TLS handshake failed" string to be translated.
- Consider IPv4 addresses x.x.x.0 as non-routable.
- Now uses own hash table and hash set implementations.
- Strengthened entropy collection and ARC4 initial seeding.
- Randomly propagate GUESS 0.2 hosts among GUESS 0.2 servents.
- Assume we're not firewalled right after initial UPnP or NAT-PMP configuration.
- Avoid compiler warnings on Windows.
- Make sure random_value() returns uniformly distributed random numbers.
- Added ability to filter dumped traffic by IP address.
- Changed %F to display whole mantissa before switching to scientific notation.
- Ensure memory allocated from the heap is aligned properly.
- Show amount of detected CPUs at startup.
- Added version numbers to the crash log file name.
- Avoid complexity attacks on the hash table.