質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

9694閲覧

c#:TcpClient NetworkStreamの実装について

saki_ABC

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/07/18 02:28

編集2018/07/18 02:44

###確認したいこと
以下のコードの書き方は問題ないでしょうか?
直接TcpClientのGetStreamからNetworkStreamを叩いていますが、
クローズ処理をしていなかったりで気持ち悪く感じます。

気になる点として、
・ネットワークストリームはゲットしたものをそのまま使って問題ないかどうか(クローズはいらない?)
・受信バッファのクリアの仕方は問題ないか。
の2点です。

他になにか気になる点が有れば、教えていただけると幸いです。
よろしくおねがいします。

lang

1TcpClient tcpClient = 初期化、コネクト済み; 2byte[] byteBlank = 送信するデータ; 3 4if (tcpClient.Connected == true) 5{ 6 //受信バッファクリア 7 while (tcpClient.GetStream().ReadByte() != -1) ; 8 try 9 { 10 tcpClient.GetStream().Write(byteBlank, 0, byteBlank.Length); 11 } 12 catch 13 { 14 //ここにエラー処理 15 } 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

TCPClientのGetStreamの実装

C#

1public NetworkStream GetStream() { 2 if(Logging.On)Logging.Enter(Logging.Sockets, this, "GetStream", ""); 3 if (m_CleanedUp){ 4 throw new ObjectDisposedException(this.GetType().FullName); 5 } 6 if (!Client.Connected) { 7 throw new InvalidOperationException(SR.GetString(SR.net_notconnected)); 8 } 9 if (m_DataStream==null) { 10 m_DataStream = new NetworkStream(Client, true); 11 } 12 if(Logging.On)Logging.Exit(Logging.Sockets, this, "GetStream", m_DataStream); 13 return m_DataStream; 14} 15

このようになっています。
最初にGetStreamを呼んだときはm_DataStreamがnullのため、新たにNetworkStreamが生成されますが、それ以降はm_DataStreamがそのまま返されます。
ですので、Closeを行うとそれ以降はCloseされたStreamが返されることになります。
Closeを行う際は、TCPClientをCloseする時に行う形になるかと思います。

投稿2018/07/18 04:53

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikukiku

2018/07/18 05:04

GetStreamは何回呼んでも、同じNetworkStreamのインスタンスを返すんですね。調べて頂いてありがとうございます。勉強になります。
saki_ABC

2018/07/23 02:25

実装まで確認していただきありがとうございます。 同じStreamが帰ってくるとのことなので、切断時にclose処理でやってみます!
guest

0

・ネットワークストリームはゲットしたものをそのまま使って問題ないかどうか(クローズはいらない?)

 取得したNetworkStreamは、利用が終わったらCloseする必要があります。
ちなみに、TcpClientも利用が終わったらCloseする必要があります。
おそらく、GetStreamを何回呼び出しても同じNetworkStreamのインスタンスを返すと
思いますが、そんな使い方をしたことがないため、確証はありません(知識なし)。
なので、GetStreamで取得したNetworkStreamのインスタンスを
変数に入れて利用し、使い終わったら、Closeする流れがよいと思います。

・受信バッファのクリアの仕方は問題ないか。

 受信バッファのクリアをしたいのに、なぜかwriteしています。
writrは送信バッファに書き込む命令で、
やりたいことと、コードが不一致しています。
受信バッファをクリアしたいのであるならば、
すべて読み取って、何も利用せずに破棄すれば良いと思います。

===追記===========================
コードをちゃんとみていませんでした。
ReadByteにて受信バッファから読み取っているので問題ないと思います。

投稿2018/07/18 04:20

編集2018/07/18 04:35
kikukiku

総合スコア514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問