投稿時間: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
|