VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2007/04/18(Wed) 18:02
投稿者戸豚
Eメール
URL
タイトルTCP送受信がぶつかると固まる?

Windows 2000/XP Pro、VB6.0 SP6でWinsockコントロールを使うツールを組んでいます。

通信相手はマイコンボードで、リンク確立確認のために定期的にポーリングメッセージを送ってきます。

ところが、このポーリングメッセージ受信時に近いタイミングで送信を行なうと(送信処理中に受信ありか、受信中に送信処理を始めたかまではわかりませんでしたが)VB6.0のプロセスだけがフリーズします。
タスクマネージャーのパフォーマンスを見るとCPU使用率が100%のままになります。

これの回避策はないんでしょうか?
WinsockAPIにはブロッキングとノンブロッキングの違いがある、というのはわかったんですが、Winsockコントロールはノンブロッキングではないんでしょうか?


送受信に関わるコードを載せておきます。


--------- フォームの処理 -----------------

Private Sub PortOpen_Click()
  ' コネクト
    Winsock1.Protocol = sckTCPProtocol
    Winsock1.RemoteHost = remoteIP
    Winsock1.remotePort = remotePort
    Winsock1.LocalPort = 0
    Winsock1.Connect
End Sub

Private Sub Winsock1_Connect()
  ' コネクトイベント

  Dim sndData(1) As Byte

  sndData(0) = CMDCODE_LINKESTABLISH_REQ
  sndData(1) = getSessionNumber()

  ' 通信開始要求
    Winsock.SendData(sndData)
    bBusyIsWinSock = True
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    ' 受信イベント.
    Static recvData() As Byte
    Winsock1.GetData recvData, vbArray + vbByte, bytesTotal
    Call addTcpRecivieData(recvData)
End Sub

Private Sub Winsock1_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)
  ' エラー

    Debug.Print ""
    Debug.Print "WinSock error"
    Debug.Print "WinSock State=" & Winsock1.state
    Debug.Print "Number      = " & Number
    Debug.Print "Description = " & Description
    Debug.Print "Scode       = " & Hex(Scode)
    Debug.Print "Source      = " & Source
    Debug.Print ""
    
    Debug.Print ".LocalHostName = " & Winsock1.LocalHostName
    Debug.Print ".localIP       = " & Winsock1.localIP
    Debug.Print ".LocalPort     = " & Winsock1.LocalPort
    Debug.Print ".name          = " & Winsock1.name
    Debug.Print ".Protocol      = " & Winsock1.Protocol
    Debug.Print ".RemoteHost    = " & Winsock1.RemoteHost
    Debug.Print ".RemoteHostIP  = " & Winsock1.RemoteHostIP
    Debug.Print ".RemotePort    = " & Winsock1.remotePort
    Debug.Print ".SocketHandle  = " & Winsock1.SocketHandle

    MsgBox Description, vbOKOnly, "ERROR"

    Winsock1.Close
    Debug.Print "Winsock State=" & Winsock1.state
End Sub

Private Sub Winsock1_SendComplete()
    ' 送信完了
    bBusyIsWinSock = False
End Sub


------------- 実際に送信処理を行うモジュールの処理 -------------

Public Function addTcpSendingData(ByRef sndData() As Byte) As Boolean

    If sckConnected = Form1.Winsock1.state Then

        Do
            DoEvents
        Loop While Form1.bBusyIsWinSock
    
        Call Form1.Winsock1.SendData(sndData)
        Call Form1.setWinsockBusy
        addTcpSendingData = True
    Else
        addTcpSendingData = False
    End If
End Function


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -