tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVB6でのクライアントの接続確認と再送信処理について
記事No15790
投稿日: 2013/08/15(Thu) 10:40
投稿者shym

'VB6のPC1(クライアント)とPC2(サーバ)でTCP/IPのソケット通信をしています。
プログラムは、PC1のクライアントです。
質問
1,クライアントの接続確認処理で失敗したらエラー表示が出るのですが形としては、判定処理は、次のような形で問題ないでしょうか?
2,送信に失敗した時の処理、要するに再送信処理についての判定処理は、次のような形で問題ないでしょうか?
問題がある場合、普通は、どのように考えるのでしょうか。


Public Sub OpenSocket(ByVal blnChange As Boolean)
     On Error GoTo OpenSokcet_Error
    
     If gstrRemoteUse = "未使用" Or blnChange = False Then Exit Sub
    
     If WinsockMeasResult.State <> sckClosed Then
        If blnChange = True Then
            WinsockMeasResult.Close
        End If
     End If
    
     If WinsockMeasResult.State <> sckConnected Then
        WinsockMeasResult.Protocol = sckTCPProtocol
        WinsockMeasResult.RemoteHost = gstrRemoteIpAddress
        WinsockMeasResult.RemotePort = gintRemotePortNo
        WinsockMeasResult.Connect

        Do While ((WinsockMeasResult.State > 0 And WinsockMeasResult.State < 7))  '接続もしくは切断されるまで待機
            
            If TimerSocketTimeOut.Enabled = False Then
                TimerSocketTimeOut.Enabled = True
            End If
            If gblnSocket_TimeOut = True Then
                Exit Do
            End If
            
            DoEvents
        Loop
        
     End If
    
     Exit Sub
    
OpenSokcet_Error:
    
    Call DispError(Err.Description, "ソケットオープン", "測定")
    Resume Next
    
End Sub

'●●●●● ソケットクローズ ●●●●●
Public Sub CloseSocket()
    On Error GoTo CloseSokcet_Error
    
'    If WinsockMeasResult.State = sckConnected Then
'        WinsockMeasResult.Close
'    End If
'
    WinsockMeasResult.Close
    
    Do While Not (WinsockMeasResult.State = sckClosed) '切断されるまで待機
        DoEvents
    Loop
    
    
    Exit Sub
CloseSokcet_Error:
    Call DispError(Err.Description, "ソケットクローズ", "メインフォーム")
    Resume Next
End Sub

'文字列の受信
Private Sub WinsockMeasResult_DataArrival(ByVal bytesTotal As Long)
       Dim buff As String
       WinsockMeasResult.GetData buff
      
       If gstrRemoteUse = "使用" And Mid(buff, 1, 3) = "GET" Then
           '最新の測定結果送信
           WinsockMeasResult.SendData (gstrSocket_MeasResult)
       End If
End Sub



Private Sub WinsockMeasResult_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
     'エラー
       On Error GoTo WinsockMeasResult_Error
       Dim intReturn As Integer
      
       WinsockMeasResult.Close
      
       If Description = "ホストへの経路がありません。" Or _
          Description = "タイム アウトのため接続できませんでした。" Or _
          Description = "接続が受け付けられませんでした。" Then
            intReturn = MsBoxSocket("リモートシステムへの接続に失敗し" + vbCrLf + "ました。ネットワークの設定、リモ" + vbCrLf + "ートホストの起動確認、ケーブル" + vbCrLf + "の断線確認をして下さい。", vbCritical, "ソケット通信エラーメッセージ")
       End If
       If Description = "タイムアウトまたは他の問題によって、接続が中断されます。" Then
            intReturn = MsBoxSocket("リモートシステムへの送信に失敗し" + vbCrLf + "ました。ネットワークの設定、リモ" + vbCrLf + "ートホストの起動確認、ケーブル" + vbCrLf + "の断線確認をして下さい。データ" + vbCrLf + "を再送しますか?", vbCritical + vbYesNo, "ソケット通信エラーメッセージ")
            If intReturn = vbYes Then
'                 OpenSocket (True)
'                '再送信
'                 WinsockMeasResult.SendData (gstrSocket_MeasResult)
            End If
            
       End If
      
       Exit Sub
WinsockMeasResult_Error:
    Call DispError(Err.Description, "ソケットクローズ", "メインフォーム")
    Resume Next
End Sub


'1000msec
Private Sub TimerSocketTimeOut_Timer()
     TimerSocketTimeOut.Enabled = False
     gblnSocket_TimeOut = True
End Sub

[ツリー表示へ]
タイトル追加質問
記事No15791
投稿日: 2013/08/15(Thu) 22:07
投稿者shym
WinsockMeasResult_Error関数の中の
再送信ロジックもここに記載していいものなのでしょうか?

[ツリー表示へ]
タイトル補足
記事No15792
投稿日: 2013/08/15(Thu) 22:10
投稿者shym
WinsockMeasResult_Error関数の中のMsBoxSocket関数でエラー表示をしています。

[ツリー表示へ]