我的TCPStream代码如下:

use std::error::Error;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;

#[tokio::main]
pub async fn match_tcp_client(address: String, self_ip: String) -> Result<(), Box<dyn Error>> {
    // Connect to a peer
    println!("client to connect at {}", address);
    let mut stream = TcpStream::connect(address.clone()).await?;
    println!("client done");
    // Write some data.
    stream.write_all(self_ip.as_bytes()).await?;
    stream.write_all(b"hello world!EOF").await?;
    // stream.shutdown().await?;
    Ok(())
}

我的问题是,有没有办法让客户端知道服务器是否正确接收了数据,如果没有重新发送数据?

推荐答案

TCP提供可靠的数据传输.使用流量控制、序列号、确认和计时器,TCP确保数据从发送过程到接收过程正确有序地传递.

如果您想要一个安全的解决方案来防止man-in-the-middle次攻击,您可以使用tokio中的TLS protocol.此外,您还可以发送预计算出的发送数据checksum,与BitTorrent协议does的方式相同.

Rust相关问答推荐

泛型属性比较

Rust中的相互递归特性与默认实现

使用pyo3::Types::PyIterator的无限内存使用量

为什么BitVec缺少Serialize trait?

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

异步函数返回的future 生存期

try 创建随机数以常量

从 rust 函数返回 &HashMap

Rust 如何返回大类型(优化前)?

为什么我们有两种方法来包含 serde_derive?

Button.set_hexpand(false) 不会阻止按钮展开

了解 Rust 闭包:为什么它们持续持有可变引用?

将 Futures 的生命周期特征绑定到 fn 参数

使用 `clap` 在 Rust CLI 工具中设置布尔标志

是否可以在 Rust 中的特定字符上实现特征?

SDL2 没有在终端键上触发?

仅当满足外部条件时如何添加到 actix web 的路由

覆盖类型的要求到底是什么?为什么单个元素元组满足它?