问题标签 [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.

0 投票
1 回答
1306 浏览

rust - 实现相同方法的两个特征没有错误

根据文档,如果我尝试调用由以下两个不同特征提供的方法,Rust 应该会抱怨:

运行它会导致预期的error: multiple applicable methods in scope错误。

但是我没有得到任何错误:

mio::buf::RingBuf实现BufRead。这两个特征都提供了一种bytes方法。

我希望 Rust 会抱怨与上面相同的错误。相反,它默默地选择“错误”的实现,然后println抱怨错误的类型。

知道为什么我在这里没有收到错误吗?

如果我删除use std::io::Read;一切正常。但是由于范围内的特性突然使用了 Read 的实现,并且 bytes 具有“错误”类型。

(我正在使用 Rust 1.0.0)

0 投票
1 回答
799 浏览

rust - 在 MIO 中检测客户端挂断

使用 MIO (0.3.5) 时如何检测连接的终止?

我尝试了以下方法:

运行这个。使用类似的东西连接到它nc localhost 1234。使用 Ctrl-C 终止连接。我的代码会认为有新数据可用(hint==ReadHint::data())。尝试读取它将导致零字节可用。

提示不应该是这样的ReadHint::hup()吗?

0 投票
1 回答
251 浏览

rust - 如何移动借来的内容以关闭连接

下面的代码应该接受 tcp 连接,从中读取,并在挂断时关闭它们。

这几乎可以工作。在 C_CLIENT 情况下,我想处理客户端挂断。在那种情况下,我想我需要将连接的所有权从我的处理程序转移到方法,以便让它超出范围以关闭它。

不幸的是,rust 不允许我移动连接:

据我了解,问题在于&self该方法是借用的readable,因此无法访问其字段。

如何访问连接?(避免上述错误。)

如何关闭该连接?(即转让所有权。)

0 投票
1 回答
367 浏览

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也不会影响这一点。

0 投票
1 回答
442 浏览

struct - 同时改变多个结构字段的最快惯用方法是什么?

许多库允许您定义一个实现给定的类型trait以用作回调处理程序。这要求您将处理事件所需的所有数据集中在一个数据类型中,这使借用变得复杂。

例如,mio允许您Handler运行EventLoop. 考虑一个具有这些平凡数据类型的示例:

Token您的处理程序有一个从到类型的项目的映射A。每个 type 项A可能已经或可能没有 type 的关联值B。在处理程序中,您想要查找A给定的值Token,如果它还没有B值,请从处理程序的Pool<B>.

在这种安排中,即使直观地可以看到它self.map是不同的实体,但借用检查器会在我们访问时self.pool抱怨self已经借用(通过) 。self.mapself.pool

一种可能的方法是将每个字段包装MyHandlerTypeOption<>. 然后,在方法调用开始时,将take()这些值取出self并在调用结束时恢复它们:

这行得通,但感觉有点笨拙。它还self为每个方法调用引入了将值移入和移出的开销。

最好的方法是什么?

0 投票
1 回答
173 浏览

rust - 生成 mio 的 Token 时应该注意哪些限制?

用于异步 I/O的mio依赖于开发人员提供类型Token实例,以便将发生的事件关联回源,例如特定的TcpStreamHandler::Timeout.

实现中可以看出,Token它只是一个围绕 a 的包装器类型usize。每次Token需要 a 时简单地增加一个计数器是很诱人的,但它最终会溢出。

Tokens在生成传递给?时,我应该记住哪些规则EventLoop?一些具体问题:

  • 如果我有两个线程,每个线程都有自己的EventLoop,它们都可以Token=0用来监听两个不同流上的事件吗?(即Tokens绑定到特定EventLoop实例?)
  • 我可以Token=0用来同时表示 aTcpStream和 apending Timeout,还是它们都存储在同一个令牌集合中?
  • 0从跳到有什么害处1,000,000吗?(例如,它们是否存储在针对序列号优化的数据结构中?)

谢谢!

0 投票
1 回答
640 浏览

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 上也没有超时。

这是事件循环的代码:

这是处理程序的代码:

0 投票
1 回答
169 浏览

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 获得。

0 投票
1 回答
461 浏览

rust - mio 中缓冲区类型的问题

我想使用 mio 在 Rust 中编写一个异步服务器,但缓冲区类型有问题。我尝试了不同的缓冲区类型,但无法正常工作。我目前的代码是:

包含以下Cargo.toml依赖项:

目前在 Cargo.lock 中转换为字节 0.2.11 和 mio 0.4.3。

我得到的错误是:

我希望能够将 aVec<u8>写入套接字并处理仅部分写入缓冲区的情况。我怎样才能做到这一点?

我不需要解释正确处理返回值的代码,这个问题是关于缓冲区类型的。我不知道我必须使用哪种缓冲区类型。

0 投票
1 回答
244 浏览

rust - 本机库“kernel32”被多个包链接到

我克隆并尝试构建MIO coroutines library,但它的依赖项似乎发生了冲突:

似乎依赖项time需要kernel320.1.4,但另外两个依赖fs2memmap需要 0.2.0。

我能做些什么来解决它,或者在这种情况下最好的解决方案就是提交错误报告?

在相关说明中,如果 repo 没有 Cargo.lock,这算作 bug 吗?我已经看到它建议始终将 Cargo.lock 添加到版本控制中以防止出现此类问题。