- PR -

通信処理での受信タイムアウトについて

1
投稿者投稿内容
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-07-07 23:42
いつもお世話になります。
通信プログラムを勉強中なのですが、
受信タイムアウトの取り方でいい方法が見つからず困っています。
どなたか、ご存知の方がいましたらご教授いただけないでしょうか?
下記に作成したコードを示します。

Dim myNetWork As System.Net.Sockets.NetworkStream = tcp.GetStream()
・・・
Do
'データの一部を受信する1
Dim resBytes(tcp.ReceiveBufferSize) As Byte
  'ここで、データを受信するまで待機になる。
resSize = myNetWork.Read(resBytes, 0, resBytes.Length)

'Readが0を返した時はクライアントが切断したと判断
If resSize = 0 Then
Exit do
End If

'受信データを貯める
Array.Copy(resBytes, 0, tmpBytes, iloc, resSize)
iloc += resSize

If iloc >= 10 bSt = False Then
  '受信バッファより送信サイズを取得
  iLen = resBytesより取得
bSt = True
End If

' コマンド長に達した場合の処理
If iloc >= iLen Then
・・・
End If

Loop While myNetWork.DataAvailable

やりたい事としては、
最初にデータを受信してから(上記の受信長を取得してから)全ての
データを受信するまでの間の時間でタイムアウトを取ろうと考えているのですが、
次のmyNetWork.Read(resBytes, 0, resBytes.Length)で処理が待機されるため
思ったようにタイムアウトを取ることができません。
何かよい方法などありませんでしょうか?

よろしくお願いします。

れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-08 00:32

NetworkStream.ReadTimeoutで望みの時間を設定する、
NetworkStream.BeginReadで非同期処理で時間を計測する、
別スレッドで処理をさせてメインスレッドで時間を計測する、

などの手があります。
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-07-08 13:30
早速のご回答ありがとうございます。

NetworkStream.ReadTimeoutで望みの時間を設定する場合の
処理ですが、

@クライアントの接続
Aクライアントからデータの送信
Bデータの受信
Cクライアントへ結果を返す
の処理がある場合、
@の接続時からAの処理前までの時間は無視したいと考えています。
実際に計測したいのがAの送信(実際にはBの受信開始)〜Bでクライアントのデータの受信終了
までの時間を計測したいと考えております。
この場合でもReadTimeoutにて受信タイムアウトを取得する方法が
あるのでしょうか?
(例えば、Aの送信要求(Bの受信開始)があれば、ReadTimeoutの設定を行うなど)

ちょっと説明が分かりにくく申しないのですが、
よろしく御願いします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-09 02:00

>この場合でもReadTimeoutにて受信タイムアウトを取得する方法が
>あるのでしょうか?

あります。

MSDNのNetworkStream.ReadTimeoutプロパティの説明には

>読み取り操作がデータを待機する時間を取得または設定します。

と書かれています。
MSDNはたまに間違ってますが、これは間違っていません。
額面どおり、
読み取り操作を開始してからデータを受け取るまでの時間の最大値を
あらわすプロパティです。

>やりたい事としては、
>最初にデータを受信してから(上記の受信長を取得してから)全ての
>データを受信するまでの間の時間でタイムアウトを取ろうと考えているのですが、

ループでReadを何回も呼ぶ場合でも、
きちんとプログラミングすれば
上記要件は満たすように作ることができます。

受信開始時に時刻を取得し、
ReadのたびにTimeoutを設定すれば
いけるでしょう。
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-07-09 22:28
ご回答の程ありがとうございます。

受信開始時に時刻を取得し、ReadのたびにTimeoutを設定すればいけるでしょう。
という事だったのですが、

受信開始時というのは、どのような判断となるのでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)