• Stars
    star
    196
  • Rank 197,941 (Top 4 %)
  • Language
    Rust
  • License
    GNU General Publi...
  • Created about 2 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Quick Peer-To-Peer UDP file transfer

qft

QFT is a small application for Quick (and really reliable) Peer-To-Peer UDP file transfer.

If a friend sent you here...

...look at the "Releases" section on the sidebar. You should see a link titled vX.Y.Z. Click on that, and then choose the right file for your OS: qft for Linux, qft-mac for Mac, and qft.exe for Windows. Download this file, make it executable in case of Linux or Mac, and then follow your friend's instructions on how to receive the file they wanted to send you.

Usage:

  • Find a public QFT helper (for example tudbut.de:4277)
  • On the sender PC, enter qft sender <helper> <shared-phrase> <filename>.
  • On the receiver PC, enter qft receiver <helper> <shared-phrase> <filename>.
  • Both PCs should start transferring after a short while. If they don't, try again.

OR

  • On both PCs, enter qft gui.
  • Select mode
  • Select file to send and file to save to
  • Update the shared phrases to match
  • Click start

Arguments:

qft helper   <bind-port>
qft sender   <helper-address>:<helper-port> <phrase> <filename> [bitrate] [skip]
qft receiver <helper-address>:<helper-port> <phrase> <filename> [bitrate] [skip]

What helpers do

Helpers are NOT relays for data, they are only used to ESTABLISH the connection.

Helpers are there to help with holepunching.

  • P1 connects* to helper
  • P1 sends the phrase to the helper
  • P1 waits for a response
  • Some time passes
  • P2 connects* to the same helper
  • P2 sends the phrase to the helper
  • P2 gets P1's public IP and port
  • P1 gets P2's public IP and port
  • P1 and P2 disconnect* from the helper
  • P1 and P2 start a loop (slightly simplified):
    • fire a packet at eachother multiple times
    • try to receive as many packets from the other one
    • if none are received, loop again
    • if one is received, exit the loop
  • Connection between P1 and P2 is established.

*UDP is a connection-less protocol, there are no handshakes. The word "connection" is used here as an indicator that data will be exchanged between the "connected" parties. The word "disconnect" is used here as an indicator that no more data will be exchanged between the "previously connected" parties.

Debunking some myths about P2P networking

  • "True P2P is only possible without a NAT" - Both my experiments and wikipedia would like to have a word about hole punching. The only issue I have found are some german mobile data providers, but sending large files over mobile data is rarely something you'd want to do - and if so, use something like croc or the magic wormhole, which aren't purely true P2P.
  • "Croc is P2P as well, why does this exist?" - Croc is not Peer-to-Peer. Croc uses a relay server to exchange data between the two clients (unless one of the client has a port-forward set up, which is almost never the case). That is Client-to-Server-to-Client, which is not really Peer-to-Peer. Peer-to-Peer means two clients sending their data directly to eachother, without a server. "Peers make a portion of their resources, such as processing power, disk storage or network bandwidth, directly available to other network participants, without the need for central coordination by servers or stable hosts." - Wikipedia

Tips 'n Tricks

  • You can add a number to the end of both of your commands (after the filename) to boost transfer speeds (higher = faster), but a too large number might cause unreliability due to local network conditions or VPNs. The maximum possible is 65532 (65535 - 3).
  • You can run a helper yourself, as the "helper" mode argument suggests. This helper should simply be run on a server which is reachable from all over the web (a cheap VPS will definitely do).
  • Helpers don't have to be run on a public server, they work in LAN too, but that way, only computers in the same LAN will be able to use them.
  • You can allow streaming (for example when you want to transmit from /dev/stdin) by setting the QFT_STREAM environmental variable.
  • To use qfts and qftr aliases on linux or mac, run (replacing (shell) with your shell name, usually bash or zsh):
echo 'alias qftr="qft receiver tudbut.de:4277"' >> ~/.(shell)rc
echo 'alias qfts="qft sender tudbut.de:4277"' >> ~/.(shell)rc
source ~/.(shell)rc

Cool stuff

  • Files are transferred over UDP, but qft has additional reliability measures in place to avoid broken files.
  • Unreliable internet connection? No problem! QFT will simply pause transmission until the connection is back! Doesn't work? Check out the "Resume a fully stopped transfer" section!
  • Did you know you can hibernate or suspend your computer while it's transferring and it'll continue where it left of, even when only one side is suspended? (Unless your router blocked the port, read the "Resume a fully stopped transfer" section in that case)
  • QFT can withstand heavy weather network conditions: 1000ms ping is just as fast as 10ms ping, packet loss/reorder rates of over 10% are tolerated (but can slow speeds down, especially when ping is high).
  • It's written in 100% pure Rust.

Resume a fully stopped transfer

You most likely won't need this unless the transfer completely died due to a VERY long pause or a computer restart, but if you do:

Stop qft on both ends and start it again with the [skip] parameter in place (if you didn't specify a bitrate before, the default is 256). It will skip those bytes and continue where you specified.

Troubleshooting

It says Connecting... but doesn't connect

One of your ends didn't correctly connect to the helper. Stop the transfer on both ends and try again.

Croc

Many people have mentioned how this is like croc. It isn't, because croc uses a relay that all your data is sent through. This is a bottleneck and also means that the relay admins are responsible for the content that is sent. The relay also buffers a lot of data, meaning its RAM might fill up if the sender's connection is much faster than the receiver's. Croc being tagged "peer-to-peer" is misleading at best because it rarely uses the P2P capabilities (it requires a port-forward to do P2P, which is rarely done). Read the previous section about P2P myths if you think Croc is always peer-to-peer.

Relevant XKCD

Relevant XKCD Image

FAQ

What is a helper?

As explained above, it is used to establish the connection between the two partners.

Why is a helper needed?

Your router uses a thing called Network Address Translation. It is required because otherwise, there would be way too many IP addresses in use and the internet would cease to work during busy times. This NAT is also a problem however, because it is a layer between your PC and the open internet. When there is a new incoming connection, the NAT won't know which PC in your LAN to forward the connection to, so the connection is simply rejected. Any Peer-to-Peer software therefore needs a helper server (also called "STUN" server) which both peers will ask for the other's IP address and port. Both peers can then send a bunch of outgoing connections to eachother. If everything goes well, both peers have sent an outgoing with the right timing, causing both NATs to think they are outgoing connections, when actually, they are a sort of combination of incoming and outgoing ones.

TL;DR: P2P networking is impossible without a helper server, because of Routers. Port-forwarding would be required otherwise, which can be hard to set up.

How to make a public/private helper?

Read the 2nd bullet point in the Tips 'n Tricks section.

More Repositories

1

bottyclient

A slim Discord client with many cool features including less network traffic which supports bot tokens, but user tokens theoretically work too. Tags: Discord Bot Client Token for Bot Botting Download English
JavaScript
80
star
2

ttc

TTC Client
Java
34
star
3

picoAM

A simple but capable AM transmitter for the Raspbery Pi pico!
C++
30
star
4

polyfire

Minecraft mod running on the TTCp engine to load modules written in JS or ISBPL at runtime - with runtime deobfuscation!
Java
9
star
5

spl

Stack Programming Language
Rust
9
star
6

tuddylib

Java
8
star
7

revpfw3

A tool to bypass portforwarding restrictions using some cheap VServer
Rust
8
star
8

theforum

A simple forum written in JavaScript, with no browser-side JS required
EJS
8
star
9

microwfc

Small Wave-Function-Collapse implementation
Rust
7
star
10

oxibot

Oxibot is a general purpose discord bot written in Rust.
Rust
7
star
11

isbpl

Improved Stack-Based Programming Language
Java
6
star
12

ttcp-release

The first official public release of TTCp.
Java
5
star
13

ProjectorBotV2_full

Java
5
star
14

de.tudbut.api

Java
4
star
15

minechat

Connect to minecraft chats - the best commandline-minecraft-chat
JavaScript
4
star
16

microdb

Microsized database
Rust
4
star
17

link-shortener

Direct upload of the code that used to run on nickwil.de.
HTML
3
star
18

tuddyplus

HTML
3
star
19

reverse-portfw

A tool to bypass portforwarding using some cheap VServer
Java
3
star
20

leaked-ads-yt

Listing unlisted ads
3
star
21

defederation-table

A table generator for fediverse blocklists
Rust
2
star
22

bedrock-finder

Rust
2
star
23

microasync-rt

Utilities for the very small async runner
Rust
2
star
24

mvn

2
star
25

microasync

Very small async runner
Rust
2
star
26

database

Stores information inside of a json file
JavaScript
2
star
27

csac

ClientSideAntiCheat for minecraft
Java
2
star
28

ept

This is an easy way to install and search apps.
Ruby
2
star
29

dead_woman_switch

A dead-man-switch but yes
Rust
2
star
30

minecraft_fullReachFix

A reachhack fix for minecraft.
Java
1
star
31

dotfiles

my dotfiles
Shell
1
star
32

deborrow

Splits mutable references safely into their fields, or slightly less safely unborrows something completely.
Rust
1
star
33

0x539_k_tokenlogger_reversed

JavaScript
1
star
34

norussian.tk

Runs Denial of Service on Russian media sites
HTML
1
star
35

rattle

JavaScript
1
star
36

microcraft

the title is a meme
Rust
1
star
37

webhookratkiller

ez get rekt haha
Groovy
1
star
38

voter

N-Dimensional system to determine a party that fits you best
Groovy
1
star
39

discordirc

IRC Bot for discord
JavaScript
1
star
40

async-core

Standardizing rust async, one function at a time
Rust
1
star
41

micro_ndarray

Very small multi-dimensional-array implementation
Rust
1
star
42

ident-concat

Concatenates identifiers.
Rust
1
star
43

TTCp_invites

TTC discord invites, 20 = TTCp for 2 months
Java
1
star
44

projbotv3

Projector Bot V3
Rust
1
star
45

utils

Some examples
Shell
1
star
46

TudbuT

1
star
47

bsod

BSOD simulator compatible with Windows and Unix-like operating systems
Java
1
star
48

multicall

Macro to simplify multiple operations or calls on a single object
Rust
1
star
49

squarey

Java
1
star
50

vec_split

Splits arrays of vectors.
Rust
1
star
51

picogpiod

PicoGPIOd: A PicoGPIO daemon for other programs (incl. CLI) to interact with the GPIO quickly and simultaneously
Rust
1
star
52

pico_gpio

PicoGPIO is a tool to turn a raspberry pi pico into a decently powerful GPIO port
Rust
1
star
53

isbpl-random-stuff

Random stuff written in ISBPL, this includes some libs
Vim Script
1
star
54

optiplot

A minecraft 1.19.2 mod for very free claiming of land, and optimizations for many players in one area.
Java
1
star
55

mapedit

Java
1
star
56

todo-android

Android ToDo app. License: GPL3
Java
1
star
57

picofi

A wifi helper for the Raspberry Pi Pico W
C++
1
star