問題タブ [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 - 同じメソッドを実装する 2 つのトレイトでエラーなし

docsによると、次のような 2 つの異なるトレイトによって提供されるメソッドを呼び出そうとすると、Rust は文句を言うはずです。

これを実行すると、予想されるerror: multiple applicable methods in scopeエラーが発生します。

ただし、これに対してエラーは発生しません。

mio::buf::RingBufBufと の両方を実装しReadます。どちらのトレイトもbytesメソッドを提供します。

Rust が上記と同じエラーで文句を言うと思います。代わりに、「間違った」実装を静かに選択し、後でprintln間違ったタイプについて文句を言います。

ここでエラーが発生しない理由は何ですか?

削除すると、use std::io::Read;すべて正常に動作します。しかし、スコープ内のその特性により、突然 Read の実装が使用され、bytes は「間違った」型になります。

(私は Rust 1.0.0 を使用しています)

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て、コールバック ハンドラとして使用できます。これには、イベントを処理するために必要なすべてのデータを 1 つのデータ型にまとめる必要があり、借用が複雑になります。

たとえば、を実行mioすると、構造体を実装Handlerして提供できます。これらの自明化されたデータ型の例を考えてみましょう:EventLoop

ハンドラーには、Tokenタイプ のアイテム から へのマップがありますA。type の各アイテムには、 typeAの関連付けられた値がある場合とない場合がありますBAハンドラーで、指定された の値を検索し、まだ値Tokenがない場合Bは、ハンドラーの から値を取得しますPool<B>

self.mapこの配置では、とself.poolが別個のエンティティであることを直感的に確認できますが、 にアクセスすると、 が ( を介して)self既に借用されているとボロー チェッカーが文句を言います。self.mapself.pool

これに対する考えられるアプローチの 1 つは、各フィールドを でラップすることMyHandlerTypeですOption<>。次に、メソッド呼び出しの開始時に、take()これらの値を取り出しself、呼び出しの最後に復元します。

これは機能しますが、少しおかしな感じがします。selfまた、メソッド呼び出しごとに値を出し入れするオーバーヘッドも発生します。

これを行う最善の方法は何ですか?

0 投票する
1 に答える
173 参照

rust - mio のトークンを生成する際に注意すべき制約は何ですか?

非同期 I/Oのmioライブラリは、発生したイベントをソースに関連付けるためにTokenインスタンスを提供する開発者に依存していTcpStreamますHandler::Timeout

実装からわかるように、Tokenは単なるラッパー型usizeです。Tokenが必要になるたびに単純にカウンターをインクリメントしたくなるかもしれませんが、最終的にはオーバーフローしてしまいます。

Tokensに渡すために生成するときに、どのようなルールを覚えておく必要がありEventLoopますか? 具体的な質問:

  • それぞれ独自の を持つ 2 つのスレッドがある場合EventLoop、両方を使用Token=0して 2 つの異なるストリームのイベントをリッスンできますか? (つまり、特定のインスタンスTokensにバインドされていますか?)EventLoop
  • を使用して aと pending のToken=0両方を同時に表すことはできますか? それとも両方とも同じトークンのコレクションに格納されていますか?TcpStreamTimeout
  • 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 を操作すると、「MutBuf は MutSliceBuf 型に対して実装されていません」というエラーが表示される

学習目的で、私は現在、特定のポート セット (10000-60000 など) で動作する UDP パケット用のエコー サーバーを実装する小さなプログラムを作成しようとしています。このために 50k スレッドをスパムするのはあまり良くないので、非同期 IO を使用する必要があり、mio はこのタスクに最適です。しかし、私はこのコードで最初から問題を抱えています:

これは、mio の test_udp_socket.rs からのほぼ完全なコピーペーストです。しかし、mio のテストは正常にパススルーされますが、このコードをコンパイルしようとすると、次のエラーが発生します。

しかし、bytes クレートの src/buf/slice.rs のコード (ローカル コピーも) を調べると、このトレイトが実装されていることがはっきりとわかります。

それはおそらく些細なことですが、私はそれを見つけることができません... このエラーを引き起こす問題は何ですか?

私は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 に変換されます。

私が得ているエラーはこれです:

Vec<u8>ソケットに a を書き込んで、バッファが部分的にしか書き込まれていない場合を処理できるようにしたいと思います。どうすればそれを達成できますか?

戻り値を適切に処理するコードについての説明は必要ありません。この質問はバッファ タイプに関するものです。どのバッファタイプを使用する必要があるかわかりません。

0 投票する
1 に答える
244 参照

rust - ネイティブ ライブラリ `kernel32` が複数のパッケージによってリンクされています

MIO コルーチン ライブラリを複製してビルドしようとしましたが、依存関係が衝突しているようです。

time依存関係には 0.1.4 が必要なようですkernel32が、他の 2 つの依存関係fs2memmapは 0.2.0 が必要です。

それに対処するために私ができることはありますか、またはこのような場合の最善の解決策は、バグレポートを提出することだけですか?

関連するメモとして、リポジトリに Cargo.lock がない場合、それはバグとしてカウントされますか? このような問題を防ぐために、Cargo.lock を常にバージョン管理に追加することを推奨しているのを見てきました。