- PR -

VB.NETでコネクトを切断せずに連続送受信できないか?

1
投稿者投稿内容
たむちゃん
会議室デビュー日: 2003/02/18
投稿数: 5
お住まい・勤務地: 神奈川県
投稿日時: 2003-02-18 15:09
こちらには初めて投稿いたします。VB.NET初心者です。宜しくお願いします。

<動作させたいこと>
VB.NETで受信を待機して、電文を受信後、用意しておいた送信データを送信し、
同一コネクト内で、再度受信〜送信を繰り返し、次の送信データが無くなったら、
終了する、スレッド処理を考えています。

<問題点>
 1回だけの処理(コネクト→受信→送信→クローズ)では問題なく動作します。
2回以上の処理(コネクト→受信→送信→受信→送信→クローズ)をしようとした場合
コネクト→受信→送信→(networkstream.DataAvailable=False)のままでループして
しまいます。送信後、再度受信可能にするためにはどうすればよいのでしょうか?
宜しくお願いします。
 

考えたスレッドのソースは以下の通りです。

Public Class clsSend
Public intSendTimer As Integer    '受信後、送信までのタイマ
Public intSendNo As Integer      '送信データ構造体用選択パラメータ

Sub ThreadSend()
Dim tcpListener1 As New TcpListener(45001)
Dim intI As Integer
Dim strRecvWork As String
Dim intRecvLen As Integer
Dim intSendLen As Integer

'受信開始
intI = 0
tcpListener1.Start()

Dim tcpclient As TcpClient = tcpListener1.AcceptTcpClient
Dim networkstream As NetworkStream = tcpclient.GetStream()

Do
Try
'受信データ取得
ReDim bytRecvData(63)
Do
If networkstream.DataAvailable = True Then
'受信した????
Exit Do
End If
System.Threading.Thread.Sleep(100)
Loop
'データを64バイト読み取る
networkstream.Read(bytRecvData, 0, 64)
strRecvWork = Encoding.ASCII.GetString(bytRecvData, 0, 64)
intRecvLen = Convert.ToInt32(Val(Mid(strRecvWork, 59, 6)))
'残りのデータを読み取る(59バイト目から6バイトで残データの
'有効データ長が入っている)
If intRecvLen > 0 Then
ReDim Preserve bytRecvData(63 + intRecvLen)
networkstream.Read(bytRecvData, 64, intRecvLen)
udtRecvDenbun(intSendNo).strRecvData(intI) = _
strRecvWork & _
Encoding.ASCII.GetString(bytRecvData, 64, intRecvLen)
End If

'一定時間待ち
System.Threading.Thread.Sleep(intSendTimer)

'送信データ
intSendLen = Encoding.ASCII.GetByteCount( _
udtSendDenbun(intSendNo).strSendData(intI))
ReDim bytSendData(intSendLen)
bytSendData = Encoding.ASCII.GetBytes( _
udtSendDenbun(intSendNo).strSendData(intI))
networkstream.Write(bytSendData, 0, bytSendData.Length)

intI = intI + 1 '次の送信電文
If udtSendDenbun(intSendNo).intNo <= intI Then
           '登録されている次の送信電文が無い・・・脱出
Exit Do
End If

Catch
Exit Do
End Try
Loop
'TCP停止
tcpclient.Close()
tcpListener1.Stop()
blnSendThread(intSendNo) = False
End Sub
End Class


ちなみに送信データの構造体は以下の通りです。

<StructLayout(LayoutKind.Sequential)> _
Public Structure SENDDENBUN
Public intNo As Integer
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=10000)> _
Public strSendData() As String
Public Sub initSENDDATA()
ReDim strSendData(9999)
intNo = 0
strSendData = New String(9999) {}
End Sub
End Structure
Public udtSendDenbun(10) As SENDDENBUN '送信データ用
たむちゃん
会議室デビュー日: 2003/02/18
投稿数: 5
お住まい・勤務地: 神奈川県
投稿日時: 2003-02-24 15:49
解決しました。

niten様、RedFox様 さまざまなアドバイスありがとうございました。
結果的にはこちらのソースは正しかったようです。
(相手側のバグが判明しました。
 →既存のソケットはそのままで、新しいソケットを生成して
  要求していました)
niten様の理論とRedFox様のソースを参考にして試行錯誤を繰り返していたところ相手側のバグを発見することが出来ました
心より感謝いたします。
貴重な時間を割いていただき、ありがとうございました。

1

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