问题标签 [mio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - 实现相同方法的两个特征没有错误
根据文档,如果我尝试调用由以下两个不同特征提供的方法,Rust 应该会抱怨:
运行它会导致预期的error: multiple applicable methods in scope
错误。
但是我没有得到任何错误:
mio::buf::RingBuf
实现Buf
和Read
。这两个特征都提供了一种bytes
方法。
我希望 Rust 会抱怨与上面相同的错误。相反,它默默地选择“错误”的实现,然后println
抱怨错误的类型。
知道为什么我在这里没有收到错误吗?
如果我删除use std::io::Read;
一切正常。但是由于范围内的特性突然使用了 Read 的实现,并且 bytes 具有“错误”类型。
(我正在使用 Rust 1.0.0)
rust - 在 MIO 中检测客户端挂断
使用 MIO (0.3.5) 时如何检测连接的终止?
我尝试了以下方法:
运行这个。使用类似的东西连接到它nc localhost 1234
。使用 Ctrl-C 终止连接。我的代码会认为有新数据可用(hint==ReadHint::data()
)。尝试读取它将导致零字节可用。
提示不应该是这样的ReadHint::hup()
吗?
rust - 如何移动借来的内容以关闭连接
下面的代码应该接受 tcp 连接,从中读取,并在挂断时关闭它们。
这几乎可以工作。在 C_CLIENT 情况下,我想处理客户端挂断。在那种情况下,我想我需要将连接的所有权从我的处理程序转移到方法,以便让它超出范围以关闭它。
不幸的是,rust 不允许我移动连接:
据我了解,问题在于&self
该方法是借用的readable
,因此无法访问其字段。
如何访问连接?(避免上述错误。)
如何关闭该连接?(即转让所有权。)
rust - 导入 mio::tcp::TcpStream 但得到 std::net::tcp::TcpStream
在尝试调整示例服务器时,不确定如何处理TcpStream
我要求的这种行为和我得到的行为似乎完全不同。
示例结构定义:
后来有一个函数定义为Connection
:
显示错误write_slice
:
现在std::net::tcp::TcpStream
没有实现这一点,但mio::tcp::TcpStream
确实如此。为什么一个会被另一个替代?
将此设置为别名,use mil::tcp::TcpStream as MioTcpStream
也不会影响这一点。
struct - 同时改变多个结构字段的最快惯用方法是什么?
许多库允许您定义一个实现给定的类型trait
以用作回调处理程序。这要求您将处理事件所需的所有数据集中在一个数据类型中,这使借用变得复杂。
例如,mio
允许您Handler
在运行EventLoop
. 考虑一个具有这些平凡数据类型的示例:
Token
您的处理程序有一个从到类型的项目的映射A
。每个 type 项A
可能已经或可能没有 type 的关联值B
。在处理程序中,您想要查找A
给定的值Token
,如果它还没有B
值,请从处理程序的Pool<B>
.
在这种安排中,即使直观地可以看到它self.map
是不同的实体,但借用检查器会在我们访问时self.pool
抱怨self
已经借用(通过) 。self.map
self.pool
一种可能的方法是将每个字段包装MyHandlerType
在Option<>
. 然后,在方法调用开始时,将take()
这些值取出self
并在调用结束时恢复它们:
这行得通,但感觉有点笨拙。它还self
为每个方法调用引入了将值移入和移出的开销。
最好的方法是什么?
rust - 生成 mio 的 Token 时应该注意哪些限制?
用于异步 I/O的mio
库依赖于开发人员提供类型的Token
实例,以便将发生的事件关联回源,例如特定的TcpStream
或Handler::Timeout
.
从实现中可以看出,Token
它只是一个围绕 a 的包装器类型usize
。每次Token
需要 a 时简单地增加一个计数器是很诱人的,但它最终会溢出。
Tokens
在生成传递给?时,我应该记住哪些规则EventLoop
?一些具体问题:
- 如果我有两个线程,每个线程都有自己的
EventLoop
,它们都可以Token=0
用来监听两个不同流上的事件吗?(即Tokens
绑定到特定EventLoop
实例?) - 我可以
Token=0
用来同时表示 aTcpStream
和 apendingTimeout
,还是它们都存储在同一个令牌集合中? 0
从跳到有什么害处1,000,000
吗?(例如,它们是否存储在针对序列号优化的数据结构中?)
谢谢!
rust - 从 mio::udp::UdpSocket.recv 接收部分 UDP 数据包
我正在使用 mio::udp::UdpSocket 接收对来自客户端的请求的响应。看起来我在触发事件上收到了部分 UDP 数据包。我不确定这是否是 mio 库中的错误。
我已经尝试过 PollOpt::level()、all()、empty()、edge() 等。我想我通常想要基于 poll() 文档的 level(),但它们都不起作用。通过添加 20 毫秒的睡眠,我得到了完整的数据包。
作为参考,当使用阻塞 std::net::UdpSocket 时,我看不到任何问题。老实说,如果 std::net::SocketOpts 稳定,我会使用它。使用 mio 的目的是在套接字上获得超时,看起来 net2 将替换 std::net,但即使 net2 在 recv 上也没有超时。
这是事件循环的代码:
这是处理程序的代码:
udp - 使用 mio 处理 UDP 并收到错误“未针对 MutSliceBuf 类型实现 MutBuf”
出于学习目的,我目前正在尝试编写一个小程序,该程序将为 UDP 数据包实现 echo-server,该数据包将在一组端口(比如 10000-60000)上工作。因此,为此向 50k 线程发送垃圾邮件并不是那么好,因此我需要使用异步 IO,而 mio 非常适合此任务。但是我从一开始就遇到了这个代码的问题:
它几乎是来自 mio 的 test_udp_socket.rs 的完整复制粘贴。但是当 mio 的测试成功通过时,我尝试编译此代码,但出现以下错误:
但是从 bytes crate (也是它的本地副本)检查 src/buf/slice.rs 的代码,我们可以清楚地看到这个 trait 是如何实现的:
这可能是微不足道的,但我找不到它......可能是什么问题导致了这个错误?
我正在使用 rustc 1.3.0 (9a92aaf19 2015-09-15),板条箱 mio 和字节直接从 github 获得。
rust - mio 中缓冲区类型的问题
我想使用 mio 在 Rust 中编写一个异步服务器,但缓冲区类型有问题。我尝试了不同的缓冲区类型,但无法正常工作。我目前的代码是:
包含以下Cargo.toml
依赖项:
目前在 Cargo.lock 中转换为字节 0.2.11 和 mio 0.4.3。
我得到的错误是:
我希望能够将 aVec<u8>
写入套接字并处理仅部分写入缓冲区的情况。我怎样才能做到这一点?
我不需要解释正确处理返回值的代码,这个问题是关于缓冲区类型的。我不知道我必须使用哪种缓冲区类型。
rust - 本机库“kernel32”被多个包链接到
我克隆并尝试构建MIO coroutines library,但它的依赖项似乎发生了冲突:
似乎依赖项time
需要kernel32
0.1.4,但另外两个依赖fs2
项memmap
需要 0.2.0。
我能做些什么来解决它,或者在这种情况下最好的解决方案就是提交错误报告?
在相关说明中,如果 repo 没有 Cargo.lock,这算作 bug 吗?我已经看到它建议始终将 Cargo.lock 添加到版本控制中以防止出现此类问题。