C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: TcpClient型のソケットがデータを受信しなくなる


(過去ログ 135 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■79659 / inTopicNo.1)  TcpClient型のソケットがデータを受信しなくなる
  
□投稿者/ ari (1回)-(2016/04/27(Wed) 13:12:47)

分類:[C#] 

お世話になっております。

C#でのTcpClient型についてなのですが、現在、ソケット通信にて問題が発生しています。
具体的には、クライアントとして用意したTcpClient型のソケットが、2回目以降送信されたデータを受け付けない状態になっています。
最初に送信したデータは問題なく受信していることから、通信の接続は確立できていると考えています。
また、用意した通信切断時のイベントが発行されていないことから、通信が切断されてはいない状態だと考えられます。

通信が切断されていない状態で、送信したデータが相手に届かない場合、どのようなことが原因として考えられるのでしょうか。
どなたかご教授をお願いします。
引用返信 編集キー/
■79660 / inTopicNo.2)  Re[1]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ shu (859回)-(2016/04/27(Wed) 13:34:08)
No79659 (ari さん) に返信
> お世話になっております。
>
> C#でのTcpClient型についてなのですが、現在、ソケット通信にて問題が発生しています。
> 具体的には、クライアントとして用意したTcpClient型のソケットが、2回目以降送信されたデータを受け付けない状態になっています。
> 最初に送信したデータは問題なく受信していることから、通信の接続は確立できていると考えています。
> また、用意した通信切断時のイベントが発行されていないことから、通信が切断されてはいない状態だと考えられます。
>
> 通信が切断されていない状態で、送信したデータが相手に届かない場合、どのようなことが原因として考えられるのでしょうか。
> どなたかご教授をお願いします。
サーバーが想定している通信手順に合ってない挙動を行っているのではないでしょうか?
引用返信 編集キー/
■79661 / inTopicNo.3)  Re[2]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ ari (2回)-(2016/04/27(Wed) 13:38:23)
No79660 (shu さん) に返信
> サーバーが想定している通信手順に合ってない挙動を行っているのではないでしょうか?

通信の接続は確立しているので、後はサーバとクライアント間で送受信を行うだけと考えているのですが、他に何か必要な手順等があれば教えてください。
引用返信 編集キー/
■79662 / inTopicNo.4)  Re[3]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ Hongliang (428回)-(2016/04/27(Wed) 13:58:50)
TCP自体はそれで手順が済んでいると思われますが、その上に乗っている、アプリケーション層のプロトコルが成立しているかどうか。
これは、たとえば
・つながったらまずクライアント側がサーバにバイト列"HELLO"を送信する
・サーバ側は"HELLO"を受け取ったら"ACCEPT"を返す
・クライアント側は"ACCEPT"を受け取ったことを確認し、"GET hoge.txt"のような要求を投げる
・サーバ側は要求に応じたデータを返す
のような、やりとりの手順です。
上記のような例の場合、クライアントがアクションを起こさない限りサーバ側からは何も送信されないでしょう。
もちろん、接続したらサーバは一方的にデータを毎秒送りつけてくる、というようなプロトコルであれば別ですが。

次に、受信部分の処理の記述が妥当かどうか。
これはまだ示されていないので何とも言えませんけど。

それから、本当に接続は切断されていないのか。
「用意した通信切断時のイベント」というのがどういう風に記述されているのか分かりませんが、切断はされたがイベントが発生しないという想定外のケースが存在しているかもしれません。
netstatコマンドなどで確認されては如何でしょうか。

あとはFiddlerなりのパケットキャプチャツールを使用して、パケットのやりとりを確認されてみるのが良いでしょう。
引用返信 編集キー/
■79663 / inTopicNo.5)  Re[3]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ shu (860回)-(2016/04/27(Wed) 14:18:19)
No79661 (ari さん) に返信
> ■No79660 (shu さん) に返信
>>サーバーが想定している通信手順に合ってない挙動を行っているのではないでしょうか?
>
> 通信の接続は確立しているので、後はサーバとクライアント間で送受信を行うだけと考えているのですが、他に何か必要な手順等があれば教えてください。

Hongliangさんがいろいろと書いてくれている通り想定されることはたくさんあります。

何か必要な手順をここで聞いても正確な回答は得られません。今回アクセスしているサーバとの通信について理解されている同僚の方とかサーバ提供者に確認しないと駄目です。
引用返信 編集キー/
■79664 / inTopicNo.6)  Re[4]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ ari (4回)-(2016/04/27(Wed) 14:23:39)
No79662 (Hongliang さん) に返信
> TCP自体はそれで手順が済んでいると思われますが、その上に乗っている、アプリケーション層のプロトコルが成立しているかどうか。
> これは、たとえば
> ・つながったらまずクライアント側がサーバにバイト列"HELLO"を送信する
> ・サーバ側は"HELLO"を受け取ったら"ACCEPT"を返す
> ・クライアント側は"ACCEPT"を受け取ったことを確認し、"GET hoge.txt"のような要求を投げる
> ・サーバ側は要求に応じたデータを返す
> のような、やりとりの手順です。
> 上記のような例の場合、クライアントがアクションを起こさない限りサーバ側からは何も送信されないでしょう。
> もちろん、接続したらサーバは一方的にデータを毎秒送りつけてくる、というようなプロトコルであれば別ですが。

今作成している処理の流れとしては、
1.クライアントがサーバにコマンド1を送る。
2.サーバがコマンド1に対しての応答を返す。
3.コマンド1の応答を受けたクライアントがコマンド2をサーバに送る。
4.サーバがコマンド2に対しての応答を返す。
といった流れになっているのですが、サーバがコマンド2に対しての応答を送信したところまでは確認しているのですが、
クライアントがそれを受信していない(TcpClient.Availableが0のまま)という状態です。

 
> 次に、受信部分の処理の記述が妥当かどうか。
> これはまだ示されていないので何とも言えませんけど。

受信部分については、以下のようになっています。
while (true)
{
    //受信待ち
    if (this.Client.Available > 0)
    {
        break;	//受信したらループを抜ける
    }
    Thread.Sleep(100);
}

// 受信
if (this.Client.Available > 0)
{
    byte[] ReceiveData = new Byte[this.Client.Available]; //受信データ受け入れ先作成
    this.clientStream.Read(ReceiveData, 0, ReceiveData.GetLength(0)); //受信データ読み込み
    e.Result = System.Text.Encoding.GetEncoding("UTF-8").GetString(ReceiveData);

    if (string.IsNullOrWhiteSpace((string)e.Result) == false)
    {
	ReceiveCommand = (string)e.Result); //他で使う変数に受信内容を保存
    }
}
この処理をバックグラウンドワーカーで起動し、一度受信処理を行いループを抜けた後も、
終了時にバックグラウンドワーカー再起動を行うので、実際は無限ループと同じような処理になっています。

引用返信 編集キー/
■79665 / inTopicNo.7)  Re[5]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ shu (861回)-(2016/04/27(Wed) 15:09:31)
No79664 (ari さん) に返信

どぼんさんの所のサンプルです。

http://dobon.net/vb/dotnet/internet/tcpclientserver.html

引用返信 編集キー/
■79666 / inTopicNo.8)  Re[4]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ 774RR (396回)-(2016/04/27(Wed) 15:34:45)
TCP ってのは原理的に「パケット」ではなくて「ストリーム」なので
・送信側が Write で指定したバイト数とまったく等しいバイト数を、受信側は Read で受け取ることができる
ようなことはない。

送信側が Write(100) Write(100) としたとき、受信側は
Read 1回で 200 を受け取るかもしれないし
Read 1回目は 100 2回目は 100 を受け取るかもしれないし
Read 1回目で 10 2回目で 190 を受け取るかもしれないし
その他かもしれない。

送信側が Write(200) としたとき、受信側は
Read 1回で 200 を受け取るかもしれないし
Read 1回目は 100 2回目は 100 を受け取るかもしれないし
Read 1回目で 10 2回目で 190 を受け取るかもしれないし
その他かもしれない。

提示コードはその辺の考慮がされているように見えないけど・・・
引用返信 編集キー/
■79667 / inTopicNo.9)  Re[4]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ 野老 (1回)-(2016/04/27(Wed) 15:46:25)
Thread.Sleepって何か問題ありませんか?
この処理はバックグラウンドワーカーで行っているとのことですが、
ソース内のthisって何を指していますか?
引用返信 編集キー/
■79676 / inTopicNo.10)  Re[5]: TcpClient型のソケットがデータを受信しなくなる
□投稿者/ kiku (94回)-(2016/04/28(Thu) 09:17:58)
No79664 (ari さん) に返信

ご説明のとおりであるならば、774RRさんご指摘の問題はあるにしても、
受信はするはずなので、サーバ側に問題があるということになります。

また、サーバ側に問題がないとした場合、
クライアント側のソース公開されていない部分に問題があるということになると思います。

まず、原因を大きく切り分けるべきかと思います。
サーバとクライアントの間のパケットをキャプチャして、
コマンド2の応答が実際に発生しているか確認してみてはどうでしょうか?

※すでに確認済みかもしれませんが。。。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -