2016-09-06 17 views
1

私が解決しようとしている問題は、ネットアプリケーションでio.Readerとio.Writerを使用しています。 。効率のために、私はmemcopysがそれらを暗示するのを避けようとしています。net.PipeでGolang io.Readerの使用

私は、プレイエリア(https://play.golang.org/p/-7YDs1uEc5)にnet.Pipeを使用してテストアプリケーションを作成しました。データソースとシンクは、ネットワーク接続をモデル化するためにnet.Pipe接続のペアを使用して話し、遠端のループバックはデータをすぐに反映させます。

プログラムは、ループバックエージェントが送信されたデータを読み取る限りは取得できますが、接続ロックに書き戻すことがわかります。それは決して完了しません。さらに、シンク内の受信機はいかなるデータも受信しません。

私は、動作しているパスと完全に対称であるため、書き込みを続行できない理由を理解できません。私は双方向ネットワーク接続を使用する他のテストシステムを作成しましたが、bufioとReadStringの使用をやめた直後にこの問題が発生しました。私はそれらのコードを見て、私が逃したものを見ることができません。

ご協力いただきありがとうございます。

答えて

2

問題は、ライン68上にある:

data_received := make([]byte, 0, count) 

このラインは長さ0と容量countでスライスを作成します。 Readの呼び出しは、長さが0なのでデータを読み取れません。Writeの呼び出しは、データが決して読み取られないためブロックされます。

data_received := make([]byte, count) 

playground example

プログラムはdataSrc終了が実行する前に終了することができますので、印刷されないことがあり、「書き終えた」という注:

のような行を変更することで問題を修正します。

+0

ああ、私の愚かなこと。それは常にスライスを空にするように初期化する筋肉の記憶です。ありがとうございました –

+0

ちなみに、 'net.Pipe'によって返された' Conn'の両方が接続されているので 'io.Copy'は必要ありません! [the doc](https://golang.org/pkg/net/#Pipe)に問い合わせて明示的な 'io.Copy'なしでコードを試してみてください... –

関連する問題