V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  bli22ard  ›  全部回复第 4 页 / 共 9 页
回复总数  169
1  2  3  4  5  6  7  8  9  
149 天前
回复了 bli22ard 创建的主题 Rust rust TcpStream 为什么设计读写一体
@PTLin 有点理解了, 这里如果不是 impl Write for &TcpStream ,那 arc 就没法实现共享 tcpstream 进行写入,&File 可能也是基于这个和 drop 关闭资源考虑吧
149 天前
回复了 bli22ard 创建的主题 Rust rust TcpStream 为什么设计读写一体
多次尝试,通过 arc 确实可以实现,因为 impl Write for &TcpStream 有一个这样的实现,它就只需要 &TcpStream 的&mut &TcpStream 就可以了,arc 可以提供&TcpStream 的所有权 所以就可以调用到&TcpStream 实现的 write 方法。

实现代码如下

use std::io::{Read, Write};
use std::net::TcpStream;
use std::sync::Arc;

pub struct OwnerWriteTcpStream {
inner:Arc<TcpStream>
}

impl Write for OwnerWriteTcpStream {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
(&*self.inner).write(buf)
}

fn flush(&mut self) -> std::io::Result<()> {
(&*self.inner).flush()

}
}

pub struct OwnerReadTcpStream {
inner:Arc<TcpStream>
}

impl Read for OwnerReadTcpStream {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
(&*self.inner).read(buf)
}
}

pub struct OwnerTcpStream(TcpStream);

impl OwnerTcpStream {
pub fn new(stream:TcpStream) -> Self {
OwnerTcpStream(stream)
}
pub fn split(self) -> (OwnerReadTcpStream, OwnerWriteTcpStream) {
let arc_read=Arc::new(self.0);
let arc_write=arc_read.clone();
let read=OwnerReadTcpStream{inner: arc_read};
let write=OwnerWriteTcpStream{inner: arc_write};
(read,write)
}
}

这个回复 markdown 用不了,不知道为什么
149 天前
回复了 bli22ard 创建的主题 Rust rust TcpStream 为什么设计读写一体
@PTLin 本来读写分开不应该占用两个文件描述符,也不需要 dup syscall 。感觉 safe 代码没法实现读写分开有所有权。参考 @capric 尝试用 Arc<TcpStream> ,但是 Write Trait 的 fn write(&mut self, buf: &[u8]) -> Result<usize>; 需要一个 &mut self ,inner 的 Arc 提供不了可变借用。实现这个分离感觉只能 unsafe 代码
150 天前
回复了 bli22ard 创建的主题 Rust rust TcpStream 为什么设计读写一体
@PTLin
@capric tokio 现在还没用, 不过这个 split 够优雅。 看来这个阻塞 io 下没有一个好的方式来处理这个分离的问题。不知道 tokio split 底层具体实现的原理的是什么
150 天前
回复了 bli22ard 创建的主题 Rust rust TcpStream 为什么设计读写一体
@SingeeKing 一些资料上说,TcpStream try_clone 采用底层操作系统的 dup (在 Unix 上)或 DuplicateHandle (在 Windows 上)来创建一个新的文件描述符,该描述符指向同一个底层套接字,这样会占用一个文件描述符。另外这样调用 try_clone 不够直观。
150 天前
回复了 bli22ard 创建的主题 Rust rust TcpStream 为什么设计读写一体
@nagisaushio BufReader 是没问题,但是 BufWriter 我试了下不行。因为 BufWriter<W: ?Sized + Write> 而 Arc<TcpStream> 没有实现 Write 。arc 套 buf 看起来只能实现 Reader 不能实现 Writer 。
152 天前
回复了 bingfengfeifei 创建的主题 Linux 求助 Linux 服务器死机有哪些可能的问题
我之前零刻 eq12 ,安装 pve 慢,然后运行中负载搞了就容易死机。换了内存尝试依旧。后面还了 ssd ,好了。奇怪的是这个 ssd 检测,当移动硬盘什么都正常。
这么说的话,和这个比较像的项目,就是青龙面板,面板核心功能就是定时任务,它可以说连脚本开发文档都没有,但是热度同样很高。我之前发帖,https://www.v2ex.com/t/1016931
154 天前
回复了 bli22ard 创建的主题 Rust rust 的 File 是有魔法吗?
@nebkad
@PTLin 感谢 2 位,说明白了
154 天前
回复了 bli22ard 创建的主题 Rust rust 的 File 是有魔法吗?
@nebkad 自己实现容易吗? 主要是好奇,把&mut 搞为&,依然可以执行看起来"改变"的操作。感觉 5 楼的解释比较合理。对于 rust 来说,File 就是不可变的,变的那部分在 os 维护,读取的位置,缓冲区等等。
155 天前
回复了 bli22ard 创建的主题 Rust rust 的 File 是有魔法吗?
@nebkad 搞这个&File 可以读取(引起数据改变)操作比较迷惑,给人的感觉就是不可变突然可以变了
155 天前
回复了 bli22ard 创建的主题 Rust rust 的 File 是有魔法吗?
@Kaleidopink File 也有实现 Read trait , 不过实现方式还是用 &File 的实现。 这些其实不是重点,重点是, 为什么读取数据可以是不可变的
外部输入的 sql 参数,不使用预编译参数,不对合法性进行检查,sql 注入了。 这和 mybatis 没什么关系。
个人觉得,这和福利彩票店,各种算,各种画,并没有本质区别
190 天前
回复了 happydayandnight 创建的主题 投资 携百万资金,再次梭哈娜娜
建议去澳门,赌轮盘,一把梭哈,一把定乾坤,投资资本市场速度太慢了
200 天前
回复了 RunDuck 创建的主题 职场话题 程序猿失业,有去搞外挂的嘛?
外挂对于大多数人来说,最大的障碍是根本搞不出来。之前被抓的很多都是用 e 语言调用大神的核心实现,相当于套壳,比较偏向于外挂销售。主流游戏搞外挂很难。
@Love4Taylor
@lekai63 没听过这两个,研究一下
@niubilewodev dd 测试硬盘读写速度,qbittorrent 开 10 个种子同时下载,看看会不会死机或者硬盘报 io 错误。我使用 n100 测试的
低谷电价,一般家庭就两个使用场景比较实用, 空调和新能源汽车充电。比如你说的烘干机,烤箱这种,一般不具备使用的场景。如果你洗完衣服,要等低谷电价开始烘,那你得在晚上 10 点左右洗衣服。11 点开始烘干,12 点多烘干好, 你要么去拿,要么得让它一直转, 要不衣服得皱。烤箱, 我觉得你不会等到 11 点才开始烤吧。综合来说这种提醒什么电价的没多少实际意义。趣味性有那么一点。
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5221 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 45ms · UTC 08:20 · PVG 16:20 · LAX 00:20 · JFK 03:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.