The Graphical Gnutella Client for Unix
gtk-gnutella is a server/client for Gnutella. It runs on every Unix-like system which supports GTK+ (1.2 or above) and libxml. 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.
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
We need additional contributors for C development and documentation
News
29 March 2009, Version 0.96.6 Released
Version 0.96.6 is a stable release. The list below shows the most important bug fixed and improvements since the previous release.
Bug Fixes
- #1932909 "columns in search window do not scale properly".
- Fixed improper HTTP chunking when outputting chunks larger than 64 KiB.
- #2628899 "tries to download from my old self after IP changes".
- Was not always resuming the interrupted SHA-1 computation of a finished file when servent was closed in the middle of processing.
- Fixed bad range checking test in the download part.
- Was not paying attention to the "give_server_hostname" property and instead sent "HNAME" GGEP extensions in query hits provided a non-empty name was defined as the "server_hostname".
- Fixed improper upload slot counting which introduced race conditions, sometimes leading to having more slots used than the configured maximum (in addition to the "quick" upload slots).
- Prevent occasional crashes at shutdown time, during subsystem cleanups.
- Fixed corner cases where we could lose a server hostname and downright bug where we discarded the hostname after a DNS lookup if the subsequent connection attempt did not succeed.
Improvements
- Refuse to share certain directories: /, $HOME, $GTK_GNUTELLA_DIR, and the incomplete and corrupted directories.
- Downloads GUI: added checkboxes to invert the select/filter patterns.
- Downloads GUI: added "Modified" column and detail showing the time-stamp of the last file modification.
- Optional beautification operations on filenames: strip leading "-", remove consecutive "_" and prevent "_" surrounding punctuation characters.
- Fixed significant performance issue in the Gtk+ 1.2 front-end: update of upload statistics was O(n) but is now O(1).
- Background TTH file verification now lights an icon in the GUI.
- Show TTH tree depth in the download "Details" pane.
- Update the bitzi meta-data info box when a query finishes, so that it is not required to click on the result again after requesting bitzi data.
- Added MIME type column for search results.
- Added "Last Request" and "Last Upload" columns to the Upload History.
- Almost complete DHT support (missing only publishing of data), but code needs to be explicitly enabled by setting "enable_dht" to TRUE. The DHT knows how to look for alt-locs for files and push-proxies for firewalled hosts, and will store local data for others to query.
- New shell commands "stats", "download", "echo".
- It is now possible to rename files being downloaded (through GTK2 or shell, no support in GTK1).
- Added more filename extensions to the built-in search filters.
- Switch resources after getting an HTTP error if the connection is kept alive and the error permits follow-ups (non-busy conditions).
- Improved ability to switch resources after file completion by ignoring trailing swarming data, to keep the connection alive.
- Bitzi tickets are refreshed when explicitly requested, avoiding reuse of stale meta-data.
- Completed files are displayed during hash verification.
- Only propagate good alt-locs for files we are downloading, i.e. addresses of hosts which we know to be serving that file because we contacted them.
- Many new statistics counters.
- Allow scheduling of special downloads without considering per-host limits, as these are of a much shorter duration (THEX and browse host requests).
- Always seed completed files, regardless of their size (no PFSP minimum as with partial files), when their SHA-1 has been verified.
- Incorrectly encoded Bitzi meta-data is translated to Unicode.
- Browse-host responses are sorted alpha-numerically on relative pathnames to allow users to relate files together if they don't understand GGEP "PATH".
- Improved routing of PUSH messages by also looking whether targeted hosts happen to be one of our immediate neighbours.
- Updated Norwegian Bokmal and Spanish translations.
Under the hood
- Parse legacy Shareaza THEX URIs "urn:tree:tiger/:" (extra "/" here).
- Handle non-standard X-Thex-URI headers if peer provides a valid X-Content-URN header (Shareaza 2.1.0.0).
- Also attempt to give priority to the last "pfsp_last_chunk" bytes of downloaded files, since that can contain important indexing information to enable pre-view of partial video files.
- More MIME types known (derived from file extensions).
- Can now download THEX data at a tree depth of 11 for files larger than 1 GiB.
- Can download sub-optimal THEX data, as non-optimal data is better than none, but keeps looking for THEX data at the optimal tree depth nonetheless.
- Re-implemented scanning of shared directories as a background task so that the process (not just the GUI) is fully responsive during the whole scan.
- Let the background task scheduler compute the proper amount of ticks to use for each task.
- Upload statistics now record the file's SHA-1, so that we can consolidate partial file sharing with library sharing statistics, with the filename being forced to the library's filename.
- Avoid starting moving a completed file if there is not enough space on the targeted file system.
- Recognize and propagate the "DHT" GGEP extension in pongs.
- Added support for "DHTIPP" GGEP extension in pings, used for DHT bootstrap.
- Added more entropy to the random number seed.
- Plugged a few memory leaks.
- No longer send SHA-1 queries on the Gnutella network. They are now performed through the DHT, which has the suitable topology to do so efficiently.
- Fixed UDP bandwidth computation, and removed any limit on UDP incoming.
- Updated list of hostile IP address ranges, Geo-IP data, spam patterns and spam samples.
- Property loading from files was in O(n*n), made it O(n).
- Now detect property files being blindly copied over from another gtk-gnutella's config directory and reset properties whose value needs to be unique.
- The GUID and the KUID (Kademlia ID, the DHT node ID) were made sticky.
- Optimization of QRP lookups in tables ranging from 16k to 2M slots.
- Limit amount of hits to 10 per query hit packet, as LimeWire chokes otherwise.
- Limit amount of alt-locs in hits to 10 or LimeWire chokes.
- Keep connection alive when reporting an HTTP error to allow remote resource switching if necessary.
- Emit and parse new X-Downloaded header, apparently introduced by LimeWire.
- Added parsing of X-FW-Node-Info headers to grab push-proxies from firewalled hosts, as well as gather the proper GUID and host address/port.
- Emit X-FW-Node-Info if node is firewalled but continue to list our push-proxies in the standard X-Push-Proxies header.
- Avoid endless aggressive chunk splitting during swarming.
- Proper parsing of comma-separated values in Accept and other Accept-Encoding HTTP headers.
- Reject UDP packets from unspecified addresses.
- Drain more data out of the UDP receive buffer to prevent it from filling up.
- Strip at most 5 trailing characters from words when building the QRP table, thereby inserting less radices and making the table more sparse.
- Removed workarounds for dealing with broken 0.96.2 nodes and earlier 0.95.x.
- Extended syntax for push:// exact sources in magnets to be able to supply all the known push-proxies, even if that is an empty set. Since downloads are persisted as magnets, this also allows keeping all the previously known push-proxies across sessions.
- Upgraded PARQ to version 1.1 (mostly specification cleanups).
- Added additional anti-hammering for cases where many files on the same server are queued and gtk-gnutella is configured to launch more than 1 connection per IP. Connection attempts to the same server are now limited to 5 per minute.
Limitations
- DHT code is still experimental, although functional: configuration of parameters can only be done through the shell, and there is no support for publishing yet.
What is the DHT good for?
Now that gtk-gnutella supports the DHT (an acronym standing for Distributed Hash Table), what are the direct benefits for gtk-gnutella users?
If you enable the DHT code in gtk-gnutella, you will be able to benefit from these new features:
- Use source-less magnets. The DHT can locate files by their SHA-1. Websites like Bitzi collect this information along with further metadata about files. Bitzi also provides magnet links you can readily drag and drop onto gtk-gnutella's main window or copy and paste into its search box to search and download the desired file. Of course, magnet links can also be manually constructed as long as you know the SHA-1 of the file. Contrary to regular Gnutella searches, the DHT will find quickly (in less than a minute usually) whether someone has published that it was sharing the file.
- No spam or fakes. Look up the content you want at places you trust (like Bitzi). Magnet links can link to known sources, too, but usually don't. Therefore, they are conveniently short, look like URLs and can be posted anywhere: forums, blogs, index sites, emails, IRC etc. As they link to content instead of a specific location, they are practically permantly valid and never expire. Using your trusted communities to exchange magnet links gives you the benefit of avoiding all spam and fakes that you may suffer from with regular searches.
- Better success with firewalled sources. As firewalled hosts publish their push-proxies in the DHT, you can start a download by using only a push: source (consisting only of the servent's GUID) and gtk-gnutella will be able to lookup the DHT for you and find what the current push-proxies are for that host. Again, it is very quick and if that host has published its push-proxies, gtk-gnutella will find them.
- Faster downloads. With the DHT, you can acquire additional alternate locations for files and use native Gnutella swarming abilities to very efficiently and reliably download files.
- Improved session resuming. If you shut-down gtk-gnutella and restart it later, it will lookup for new push-proxies (the old ones that were persisted are probably obsolete) and new sources for the files which are pending in the queue, possibly re-seeding some downloads that were orphan (without active sources) for a long time.
If something has been published in the DHT (sources for files identified by their SHA-1, push-proxies for firewalled hosts identified by their GUID), it will be found in a matter of seconds. If the search is unsuccessful, it means the data is not present at this time in the DHT. There is no horizon consideration as in Gnutella searches. The only requirement is that you know how the published data is keyed in order to find it.
The key to make all that possible is to use a Gnutella servent that is capable of joining and querying the global Gnutella DHT, currently supported by LimeWire (and all its derivatives) and gtk-gnutella. The next release will add DHT publishing to gtk-gnutella to make it fully productive.
Who should activate the DHT code? Ideal nodes are leaf nodes which are not firewalled, then ultrapeers. If your peer is firewalled, you can still enable the DHT code but it will be less efficient currently for the network. The more nodes are present in the DHT, the longer they stay connected, the more powerful the DHT becomes.
Integrity checks for the source tarball
Size: 15739240 bytes urn:bitprint:GGKBP2G6CBFTHEJ6BCQKV3EMB4RKMEU5.BJ6GG3CKCHWOAT64HG6C7ZIKEUDPQNB4KP3PIDQ SHA1 (gtk-gnutella-0.96.6.tar.bz2) = 319417e8de104b33913e08a0aaec8c0f22a6129d RMD160 (gtk-gnutella-0.96.6.tar.bz2) = 0dae6af9ac64fa8d75980cafd55c5a3e9eb18dfe SHA256 (gtk-gnutella-0.96.6.tar.bz2) = 1e9e9952658134448675a991aca583b2a6bcacdc144b8a81628e1505b4567e8f
PGP Signature (186 bytes)
Thanks to everyone who contributed to this release in form of feedback, bug reports, patches or translations!
gtk-gnutella team
2 April 2008, Version 0.96.5 Released
Version 0.96.5 is a stable release. The list below shows the most important bug fixed and improvements since the previous release.
Bug Fixes
- #1870957: Wrong sign could cause out-of-bounds read and potentially a crash.
- Firewalled status was not re-verified after a port change if the previously used port was open.
- Fixed issue that caused the local peer cache to degenerate.
Improvements
- Client-side support for tigertree hashes (TTH/THEX).
- Replaced navigation tree by tabs.
- Redesigned download user-interface to make it more accessible.
- Added some selectable pre-defined search filters.
- Bitzi tickets are displayed in full raw indented XML.
- Display Bitzi and ShareMonkey URLs as search result details.
- Topless mode is available at run-time via command-line switch.
- Added default shared filename extensions: .7z, .bittorrent, .oga, .ogv, .spx, .tbz2
- Removed default shared filename extensions: .doc
- Updated translations: Japanese, Norwegian Bokmal, French.
Under the hood
- Changed default to dual use of IPv4 and IPv6 instead of IPv4-only.
- Support the "as" (Alternate Source) key in magnet links.
- Eszett (ß) is finally normalized to "ss" in search queries.
- Avoid display updates for elements not currently visible.
- Take full advantage of persistent HTTP connections to fetch multiple files from the same peer through over the same connection if scheduling permits.
- Improved TLS support and blocking detection.
- Updated list of hostile IP address ranges, bogons, Geo-IP data, spam patterns and spam samples.
Integrity checks for the source tarball
Size: 13634700 bytes urn:bitprint:QBMJUJBSF5IJ5UOCJFFBWXHARFI4PYQW.G55HBDRFR2FZNXH6GZNJA3MW7KWH62ZH7SIMBTA SHA256 (gtk-gnutella-0.96.5.tar.bz2) = 02c0f661f112739c011e0a12ebfc58d8fcb8ce6f660cc03be610ba664050b529 SHA1 (gtk-gnutella-0.96.5.tar.bz2) = 80589a24322f509ed1c2494a1b5ce08951c7e216 RMD160 (gtk-gnutella-0.96.5.tar.bz2) = 1f7b58b45955d940e19284110ad78bb6410cd3c6
PGP Signature (186 bytes)
Download the sources
[
Download via magnet-link from Gnutella
|
Direct HTTP download (13 MiB) ]
Thanks to everyone who contributed to this release in form of feedback, bug reports, patches or translations!
gtk-gnutella team
11 July 2007, Subversion Repository Relocated
The Subversion repositories of all projects hosted at SourceForge have been relocated. If you have checked out gtk-gnutella with svn before, use the following command to update its location:
svn switch --relocate \ https://svn.sourceforge.net/svnroot/gtk-gnutella/trunk/gtk-gnutella \ https://gtk-gnutella.svn.sourceforge.net/svnroot/gtk-gnutella/trunk/gtk-gnutella
After that svn update will work again.
If you have never checked out gtk-gnutella using Subversion before, the above does not apply. You can use the following command to retrieve the sources of gtk-gnutella from the Subversion repository:
svn co https://gtk-gnutella.svn.sourceforge.net/svnroot/gtk-gnutella/trunk/gtk-gnutella