Universal Data Share

We've all been there: needing to send a file to a friend or colleague, but which method to use? Could email, but the maximum attachment size is only 10 MB while the file is larger. Got to chop up the file into smaller bits. Or use an FTP or HTTP server to upload it to. Or use a filesharing website. Any method is complex and everything but straightforward. Universal Data Share changes this.

Just start UDS, put the files you want to share into its local list and send your IP (local if on LAN, global/external if on WAN) to your friend who can then immediately see those shared files and download them at his leisure. UDS simply makes use of what networks do best: share information.

See the original blog post in which I announced this project: Qt and custom network protocols, or the holy grail of the internet.

Technical Details

UDS makes use of the Internet Gateway Device (IGD) specification of the UPnP protocol which allows applications to set up forwarding rules on UPnP-enabled routers. This is how a peer-to-peer connection can be set up without having to make use of a server. The subsequent communication uses TCP with a binary protocol for message and file transfers.

The current version is implemented using C++/Qt. It should successfully compile and run on Windows, BSD, Linux, OS X and other OSes implementing BSD sockets and supported by MiniUPnPc (for IGD) and Qt.

Status

UDS is currently in Beta status. All required features are implemented, but with bugs still remaining.

Downloads

You can download Windows binaries of the current version here: Statically compiled binary for Windows. It should run on Windows XP and up.

Source

The source can be found at https://github.com/MayaPosch/Universal_Data_Share. As noted above, the Qt and MiniUPnPc libraries are required to compile it.

Protocol

The protocol is still under development, but the (probably current) protocol looks like this:

Universal Data Share Protocol

Revision 0

Defines the protocol used with UDS-compatible applications.

2011/10/25, Maya Posch
(c) Nyanko.ws
---

Implementation details:
- byte order is little-endian throughout the protocol.


BASE HEADER

size		uint32
NYANKO		uint8(6)
UDS		uint8(3)
revision	uint8
[command]

Size is the total size of the message being sent, including the full header. Two
text strings are followed by the revision number of the protocol. It's set to 0
during the Alpha development stage.


LIST command

Client:
LIST			uint8(4)

Server:
LIST			uint8(4)		
file ID			uint32			|
file size		uint64			| [repeated for each file]
name length		uint32			|
filename		uint8(length)	|

This command provides the client with a list of available server-side files.
The file ID is the ID as known at the server side. The file size is the size of
the file in bytes. The file name is of variable length, as specified by the 
preceding length. These four items are repeated for each file in the list.


FILE command

Client:
FILE			uint8(4)
file ID			uint32

Server:
FILE			uint8(4)
filesize		uint64
filename length		uint32
filename		uint8(length)
segments		uint32
SHA-1 hash		uint8(20)
filedata		uint8(*)

This command is used to download a file from the server by the client. File
size, name, length should be self-explanatory. Segments is the number of
segments the file's data is split into. Hash the SHA-1 hash. See the HASH 
command below for details on additional segment messages.


HASH command

Server:
HASH			uint8(4)
segment count		uint32
SHA-1 hash		uint8(20)
filedata		uint8(*)

This command marks messages containing additional segments of a file transfer.
The sequence number is indicated as well as the hash of the attached file data.
Hash algorithm used is SHA-1, resulting in a 160-bit hash. Segment index starts
at zero.