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

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

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

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

3回答

13659閲覧

【C#】TcpClientの受信部分で落ちてしまう

anonymousss

総合スコア13

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

1クリップ

投稿2018/03/23 02:09

前提・実現したいこと

Tcp/ipを使用したデータの送受信

発生している問題・エラーメッセージ

受信部分を

c#

1while(true) 2{ 3//処理 4}

のようにして無限ループで待機しNetWorkStream.Read()の戻り値が0のときにループを抜けるような実装なのですが、1度目のRead()は正常に取得できているようなのですが2回目Read()の際に呼び出し後にアプリケーションが落ちてしまいます。

該当のソースコード

C#

1privata TcpClient client; 2public byte[] Exec(byte[] data) 3{ 4 NetworkStream stream = null; 5 try 6 { 7 lock (client) 8 { 9 if (client.Connected == false) 10 client.Connect(Host, Port); 11 12 stream = client.GetStream(); 13 stream.Write(data, 0, data.Length); 14 stream.Flush(); 15 } 16 } 17 catch(Exception e) 18 { 19 throw new Exception(); 20 } 21 using (var mStream = new MemoryStream()) 22 { 23 // NetworkStreamからmemoryに展開 24 var buff = new byte[512]; 25 try 26 { 27 while (true) 28 { 29 // 2回目おちる 30 int size = stream.Read(buff, 0, buff.Length); 31 if (size == 0) 32 break; 33 mStream.Write(buff, 0, size); 34 } 35 } 36 catch (Exception e) 37 { 38 Console.WriteLine(e.Message); 39 } 40 return mStream.ToArray(); 41 } 42 43

試したこと

trycatchをしてみたのですが止まらずアプリケーションが落ちてしまいます。

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

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

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

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

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

g_uo

2018/03/23 02:24

Try Catchで止まらないとのことですが、Debugモードでデバッグし、Console.WriteLine(e.Message); にブレークポイントを設定しても止まりませんか?
kikukiku

2018/03/23 02:27

まずはどこで落ちているのか場所を特定する必要があります。ログをいっぱいいれて特定してみてください。
kikukiku

2018/03/23 02:34

streamとmstreamのdisposeが無いのが原因かなーー
Kunihiro_Narita

2018/03/23 02:40

デバッガのそのような挙動は、スタック領域やヒープ領域を破壊してしまっている場合に多いです。送受信部分のみを抜き取って、現象の再現する短いサンプルコードを作成してください。それで正常に動作するなら原因は送受信部分ではないので、ソースコードのこの部分だけを見ても解決できません。
guest

回答3

0

そもそもwhile文ぬけないんじゃ。。

投稿2018/03/24 10:36

koudazo_ojisan

総合スコア10

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

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

0

「落ちる」というのがどういう現象を指しているのかを説明してもらう必要がありますねー
アプリケーションが例外で終了してしまうのか、単に応答がなくなるだけなのか(なんかこれっぽいけど)
例外で終了する場合は何らかのメッセージがWindowsから出ているはずなので、それをコピペして(そのままで)提示してください。

投稿2018/03/23 02:48

編集2018/03/23 02:49
y_waiwai

総合スコア87719

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

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

0

以下のサイトが参考になりませんか?

NetworkStream.Read()は読み込むデータが無い場合デフォルトで処理をブロックする

csharp

1// 読み込みタイムアウトを設定(時間は仮です) 2stream.ReadTimeout = 100; 3

ただこの場合IOExceptionで判定するため、それが本当に正しいかどうか判断できません。
よろしくお願いします。

投稿2018/03/23 02:43

g_uo

総合スコア212

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問