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

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

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

ソケット通信でサイズが0のデータを受信した場合について


(過去ログ 8 を表示中)

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

■9044 / inTopicNo.1)  ソケット通信でサイズが0のデータを受信した場合について
  
□投稿者/ あら 二等兵(11回)-(2006/12/12(Tue) 16:51:05)

分類:[C#] 


分類:[C#] 

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

現在、C#のSocket通信を行うソフトを開発しております。

こちら側がクライアント側で、サーバ側からSizeが0のデータ
が送られてきた場合の処理について質問があります。

現在下記のようにしているのですが、Socket.Receiveで
サイズが0のデータを受信しても無視するようにしたいので
すが、どのようにすればよいでしょうか?
現在下記のように記述したのですが、一度サイズが0のデータ
を受信するとSocket.Receiveでとまらずにループを回り続けて
しまいます。


ご教授・アドバイス等よろしくお願いします。

---------------------------
bool loop; // falseの場合は処理を抜ける
int RecvDataSize; //

while (loop)
{
if (ヘッダーかどうか判定)
{
RecvDataSize = Sock.Receive(buffer, HEADER_SIZE, SocketFlags.Peek);

if (RecvDataSize == 0)
{
// この場合はSock.Reciveで受信待機の状態にしたい
// のですが、Sock.Reciveでとまりません。
}
else
{
//RecvDataSize!=0の処理
}
  }
else
{
// ヘッダー以外の場合の処理
    }
  }
}


0
引用返信 編集キー/
■9066 / inTopicNo.2)  Re[1]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ R・田中一郎 一等兵(24回)-(2006/12/13(Wed) 00:04:09)
R・田中一郎 さんの Web サイト

分類:[C#] 

> if (ヘッダーかどうか判定)

ここっての判定で下に落ちてます・・・よね?^^:

0
引用返信 編集キー/
■9068 / inTopicNo.3)  Re[2]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ taka 二等兵(5回)-(2006/12/13(Wed) 00:16:17)

分類:[C#] 

今まさに私はSocket通信プログラムの面倒を見ているのですが・・・

ちょっといまサンプルを探せてないのですが、
基本的にはまず
・Socket.Pollで状態を確認
・Pollがtrueを返したらAvailableプロパティを見て判定
・Availableが0の場合 = 受信データなし
・Availableが0以上の場合 = Receiveメソッドでデータを受信
って感じだったはず。

#面倒見ているだけで作ったわけではないので今のところうろ覚え、申し訳ないです^^;

以下参考になるかもしれません
https://www.microsoft.com/japan/msdn/community/gdn/ShowPost-15468.htm

0
引用返信 編集キー/
■9187 / inTopicNo.4)  Re[3]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ あら 二等兵(12回)-(2006/12/14(Thu) 18:08:16)

分類:[C#] 

返信ありがとうございます。

>ここっての判定で下に落ちてます・・・よね?^^:
はい、落ちてます。
ブレークポイントをおいて1つづつ移動させて確認しました。


>・Socket.Pollで状態を確認
>・Pollがtrueを返したらAvailableプロパティを見て判定
>・Availableが0の場合 = 受信データなし
>・Availableが0以上の場合 = Receiveメソッドでデータを受信
>って感じだったはず。
上記のやり方でコードを組んでみたのですが、同じ結果になりました。
(サイズが0のデータを受信するとSocket.Pollから下に行きその後
Sock.Available<0の条件に処理を入れない場合はSocket.Pollの判定
→Socket.Availableの判定とループを回り続けます。

Sock.Availableが0の時は相手側が切断したと考えるのが普通なの
でしょうか?
なにか他にSock.Availableが0になる条件があればご教授お願いします。
(相手側(サーバ側)は切断はしていないらしいのです。。。)

-------------
ちょっと違う話なのですが、
while(Socket.Connected)
{
if(Sock.Poll(1, SelectMode.SelectRead))
{
if(0 < Socket.Available)
{
// Receive処理
}
else
{
// 切断処理
}
}
}
とした場合、データが来るまでループを回り続けてアプリケーションが
重くなるのですが、そういうものなのでしょうか?

宜しくお願いします。


0
引用返信 編集キー/
■9192 / inTopicNo.5)  Re[4]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ taka 二等兵(9回)-(2006/12/14(Thu) 21:35:37)

分類:[C#] 

ごめんなさい、ちょっと大雑把に書きすぎました。
実際は
1. まずこちらがSendする
2. Pollする
3. Pollの結果がFalseに2に戻る
4. Pollの結果がTrue 5に移る
5. Availableをチェック
6. Availableが0以上ならReceive
7. Availableが0なら切断処理等
こんな感じですね。
ちなみに2と3でループになりますが、ここではタイムアウト値を設定しておく必要があります。
#別に相手がSendするかなんらかの原因で切られるまで待つならいいですが^^;

で、
>(サイズが0のデータを受信するとSocket.Pollから下に行きその後
>Sock.Available<0の条件に処理を入れない場合はSocket.Pollの判定
>→Socket.Availableの判定とループを回り続けます。
「Sock.Available<0の条件を処理に入れない場合は」とありますが
これって入れた場合の間違いでは?

ループが回り続けるそうですが、While(Socket.Connected)がTrueなんですよね?
切断処理に失敗している気がする。
でなきゃWhileが回り続けるはずないし。

あと
>Sock.Availableが0の時は相手側が切断したと考えるのが普通なの
>でしょうか?
経験が少ないので推測になりますが、大体は切断と捉えるのではないでしょうか?
少なくとも私の関わっているところはそうしています。
原因を特定できないために切断と捉えるより他が無いのです。

>なにか他にSock.Availableが0になる条件があればご教授お願いします。
>(相手側(サーバ側)は切断はしていないらしいのです。。。)
すいません、条件についてはちょっと分からないです。
一ついえるのは相手がSendしていないのにPollがTrueでリターンしたらAvailableは0になりますね。
#実際こんな現象が起きてます。

ちなみに無限ループのようなことをやってたらそりゃ重くなると思います。
#そのうち応答しなくなるし(実は延々とループしてるんですけどね)

0
引用返信 編集キー/
■9308 / inTopicNo.6)  Re[5]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ あら 二等兵(13回)-(2006/12/18(Mon) 20:19:28)

分類:[C#] 

返信を頂いたのに遅くなってすみません。


> ちなみに2と3でループになりますが、ここではタイムアウト値を設定しておく必要があります。
送信して、そのレスポンスを受信するというやり方もあるのですね。
大変参考になります。


> これって入れた場合の間違いでは?
いえ、入れない場合です。
行いたいことは、サイズが0の場合は処理をなにせずに、次のデータが来たときは正常に
受信できるようにしたいと思っています。
最初の質問の仕方が悪くて申し訳ありません。


> 一ついえるのは相手がSendしていないのにPollがTrueでリターンしたらAvailableは0になりますね。
> #実際こんな現象が起きてます。
現象が起きた時はどのように解決したのか、ご教授お願いできないでしょうか?


> ちなみに無限ループのようなことをやってたらそりゃ重くなると思います。
Sendで送ったのに対してコマンドを受信するという、考えが
なかったです。。。orz


0
引用返信 編集キー/
■9355 / inTopicNo.7)  Re[6]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ taka 二等兵(13回)-(2006/12/19(Tue) 21:23:58)

分類:[C#] 

すいません、ソースを確認してたので返信が遅くなりました。

>>これって入れた場合の間違いでは?
> いえ、入れない場合です。
> 行いたいことは、サイズが0の場合は処理をなにせずに、次のデータが来たときは正常に
> 受信できるようにしたいと思っています。
> 最初の質問の仕方が悪くて申し訳ありません。
なるほどそういうことでしたか、
だとしたらデータが来るまでループで待つということになるかと思います。
ところでデータを待つスレッドは別にしていますか?
スレッドの流れからクライアントだと思うのですがループで待つのが前提なら通信部は別スレッドにしたほうがいいように思います。
#しかしPollがTrueで帰ってきた場合切断するのってセオリーでは?私の勘違いかもしれませんが・・・

>>一ついえるのは相手がSendしていないのにPollがTrueでリターンしたらAvailableは0になりますね。
>>#実際こんな現象が起きてます。
> 現象が起きた時はどのように解決したのか、ご教授お願いできないでしょうか?
すいません、この現象は未解決です。

殆ど以前と変わらないレスですいません。

ちなみに私がレスした9192の2と3の部分ですが確認したところタイムアウトカウントなどはしていませんでした。
つまりPollがTrueでリターンするまで待つような実装でした。

0
引用返信 編集キー/
■9367 / inTopicNo.8)  Re[1]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ オショウ 二等兵(5回)-(2006/12/20(Wed) 00:58:26)

分類:[C#] 

> こちら側がクライアント側で、サーバ側からSizeが0のデータ
> が送られてきた場合の処理について質問があります。

  ゼロバイト受信は、finが送信された場合の挙動だったと記憶している
  のですが・・・間違いでしたかネ?!

  フリーのパケットモニタでパケットキャプチャすれば、プログラムの
  挙動と実際の通信内容の確認ができますので、是非、パケットキャプ
  チャしてみられることをお勧めします。

以上。

0
引用返信 編集キー/
■9465 / inTopicNo.9)  Re[2]: ソケット通信でサイズが0のデータを受信した場合について
□投稿者/ あら 二等兵(14回)-(2006/12/20(Wed) 22:59:47)

分類:[C#] 

返信ありがとうございます。

解決しました。。。
どうも、こちらから送信したコマンドに情報が不足していたようです。
その為、サーバ側で切断?していたようです。
※複数のサーバにそれぞれのクライアントで接続しているのですが、
 質問させて頂いたサーバのみ少し違う仕様だったようです。。。
 (サーバ側で対応してもらったので、私の方はそのままなのです。)
 
 最初、サーバは問題ないからクライアントで対応してっていわれたの
 で四苦八苦していました。。。orz
 

>スレッドの流れからクライアントだと思うのですがループで待つのが前提なら通信部は別スレッドにしたほうがいいように思います。
>#しかしPollがTrueで帰ってきた場合切断するのってセオリーでは?私の勘違いかもしれませんが・・・
受信と送信のスレッドは別々にしていました。作り直そうかどうか考え中で
した。。。すみません。説明が不足していたようで申し訳ありません。
因みに「はじめてのC#ネットワークプログラミング」だったかな?という本
を参考にしました。そこには、Pollが載っていなかったので、takaさんの返
信は大変参考になりました。

>フリーのパケットモニタでパケットキャプチャすれば、プログラムの
>  挙動と実際の通信内容の確認ができますので、是非、パケットキャプ
>  チャしてみられることをお勧めします。
パケットキャプチャはしていまして、そこでSizeData0で返ってきていたので、
「切断されてるよね?」と思ったのですが、クライアント側で無視して処理で
きない?って言われたので、質問させて頂きました。
(0サイズの時は切断処理をいれていたんですが、本当に0サイズが切断でいいの
かということに確信がありませんでした。)

最初にレスを頂いたとおり、0サイズは切断として処理するってことでよかった
んですね。。。

悩んでいた内容は解消できましたので解決ボタン押しておきます。
ありがとうございます。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -