- - PR -
VB.NETでコネクトを切断せずに連続送受信できないか?
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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-24 15:49
解決しました。
niten様、RedFox様 さまざまなアドバイスありがとうございました。 結果的にはこちらのソースは正しかったようです。 (相手側のバグが判明しました。 →既存のソケットはそのままで、新しいソケットを生成して 要求していました) niten様の理論とRedFox様のソースを参考にして試行錯誤を繰り返していたところ相手側のバグを発見することが出来ました 心より感謝いたします。 貴重な時間を割いていただき、ありがとうございました。 |
1