投稿日 | : 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