7 个版本
0.1.6 | 2022 年 3 月 21 日 |
---|---|
0.1.5 | 2022 年 3 月 20 日 |
17 在 #文件共享
每月 31 次下载
用于 mork
30KB
654 行
Dovepipe
Rust 库,用于通过 UDP 在点对点(p2p)中发送文件
入门
您可以在 /examples 文件夹中查看示例
您还可以查看官方文档
用法
这在我的其他项目 (此处) 中使用
许可
此软件在 MIT 和 Apache-2.0 许可下双授权。
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache 许可证,版本 2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-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 开始。
其余部分是文件的内容
打孔
打孔是一种使客户端能够通信而不需要端口转发的方法。
这里 是关于它的维基百科文章。
但它的原理是这样的
- 客户端 A 向客户端 B 发送 UDP 消息,包含 B 的 IP 地址和端口号。
- 客户端 B 也像客户端 A 一样做,但使用客户端 A 的 IP 地址和端口号。
- 现在他们可以互相发送 UDP 消息,从他们打孔的地方开始。
进度跟踪
当接收消息时,接收方会记住已经发送的消息。它还知道应该发送多少条消息。有了这些信息,它可以告诉发送方哪些消息尚未发送。
如果消息太多,进度跟踪可以存储在内存中,也可以存储在文件中。
您可以 计算 接收文件所需的内存,文件大小 / 500 / 8 = 进度跟踪器的大小。
示例:64gb = 64 000 000 000 / 500 / 8 = 16 000 000 = 16mb
64gb 的进度跟踪器大小为 16mb。
发送
它通过发送许多消息来发送文件。完成后,它将发送一条消息通知接收方已完成。如果有消息丢失,接收方将发送丢失消息的列表。如果文件正确接收,接收方将发送一条消息。
依赖项
~2.7–9.5MB
~77K SLoC