#udp #文件共享

dovepipe

用于在 Rust 中发送文件

7 个版本

0.1.6 2022 年 3 月 21 日
0.1.5 2022 年 3 月 20 日

17#文件共享

每月 31 次下载
用于 mork

MIT/Apache

30KB
654

Dovepipe

Rust 库,用于通过 UDP 在点对点(p2p)中发送文件

入门

您可以在 /examples 文件夹中查看示例

您还可以查看官方文档

用法

这在我的其他项目 (此处) 中使用

许可

此软件在 MIT 和 Apache-2.0 许可下双授权。


lib.rs:

用法

\

发送示例

let port = 3456;
println!("my ip: 127.0.0.1:{}", port);

// Send the file with the send_file funciton
send_file(
    Source::Port(port),
    "./examples/file_to_send.txt",
    "127.0.0.1:7890",
)
.await
.expect("error when sending file");

\

接收示例

let port = 7890;
println!("my ip: 127.0.0.1:{}", port);

recv_file(
    Source::Port(port),
    &mut File::create("output_from_recv.txt").expect("could not create output file"),
    "127.0.0.1:3456",
    ProgressTracking::Memory,
)
.await
.expect("error when sending file");

发送文件

消息

消息大小为 508 字节。这是因为这是在不丢失的情况下可以发送的最大 UDP 消息。

消息中的前 8 个字节或 64 位用于指示这是何种消息。计数从 0 开始。

其余部分是文件的内容

打孔

打孔是一种使客户端能够通信而不需要端口转发的方法。

这里 是关于它的维基百科文章。

但它的原理是这样的

  1. 客户端 A 向客户端 B 发送 UDP 消息,包含 B 的 IP 地址和端口号。
  2. 客户端 B 也像客户端 A 一样做,但使用客户端 A 的 IP 地址和端口号。
  3. 现在他们可以互相发送 UDP 消息,从他们打孔的地方开始。

进度跟踪

当接收消息时,接收方会记住已经发送的消息。它还知道应该发送多少条消息。有了这些信息,它可以告诉发送方哪些消息尚未发送。

如果消息太多,进度跟踪可以存储在内存中,也可以存储在文件中。

您可以 计算 接收文件所需的内存,文件大小 / 500 / 8 = 进度跟踪器的大小。

示例:64gb = 64 000 000 000 / 500 / 8 = 16 000 000 = 16mb

64gb 的进度跟踪器大小为 16mb。

发送

它通过发送许多消息来发送文件。完成后,它将发送一条消息通知接收方已完成。如果有消息丢失,接收方将发送丢失消息的列表。如果文件正确接收,接收方将发送一条消息。

依赖项

~2.7–9.5MB
~77K SLoC