说明:我在Activex DLL中有个方法供客户调用,作用是用服务器端的winsokc1连接客户端的winsock1,连接成功后发条消息给客户端的winsock1,客户端的winsock1收到服务器端的消息后,客户端的winsock2连接服务器端的winsock2,然后给他发给成功的消息,到此dll中的方法执行完后,最终把服务器端的两个socket关闭。
   出现的问题:我把dll和测试工程作为工程组一起执行,完全ok,把dll发布com+控件调用时,代码中只用到一个doEvents函数时调用也正常,若用到两个doEvents就会出现问题,个人觉得好像执行时造成冲突了,所以有死锁现象出现。   代码如下:
   服务器端:
Option ExplicitPrivate m_ip As String
Private m_port As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Public Function AcceptReq(ByVal sCliIP As String, ByVal sCliPort As Long) As Boolean
    On Error GoTo proccessError
    
    '
    frmTest.winsock1.RemoteHost = sCliIP
    frmTest.winsock1.RemotePort = sCliPort
    frmTest.winsock1.Connect
    
    frmTest.Winsock2.LocalPort = m_port
    frmTest.Winsock2.Listen
    
    Do
        DoEvents
    Loop Until frmTest.wnsAcceptReq.State = sckConnected
   
    frmTest.wnsAcceptReq.SendData "发送给" & sCliIP & "的" & sCliPort & "端口的数据"
    
    '只有收到客户端发过来的成功消息后,才关闭winsock
    Do
        DoEvents
    Loop Until frmTest.acceptMsg = "success"
    
    frmTest.wnsAcceptReq.Close
    frmTest.Winsock2.Close
    Exit Function
proccessError:
    MsgBox Err.Description
End FunctionPrivate Sub Class_Terminate()
    If (frmTest.wnsAcceptReq.State <> sckClosed) Then
        frmTest.wnsAcceptReq.Close
    End If
    If (frmTest.Winsock2.State <> sckClosed) Then
        frmTest.Winsock2.Close
    End If
    
End SubPublic Sub init(ByVal ip As String, port As Long)
    m_ip = ip
    m_port = port
End Sub客户端代码:
Option Explicit
Dim obj As ObjectPrivate Sub Command1_Click()
    
    Set obj = CreateObject("ActivexDLL.TestActivexDLL", "192.168.88.170")
    If (Winsock1.State <> sckClosed) Then
        Winsock1.Close
    End If
    If (Winsock2.State <> sckClosed) Then
        Winsock2.Close
    End If    Winsock1.LocalPort = 4500
    Winsock1.Listen    obj.init "192.168.88.170", 4602
    obj.AcceptReq "192.168.88.170", 4500
End SubPrivate Sub Form_Unload(Cancel As Integer)
    If (Winsock1.State <> sckClosed) Then
        Winsock1.Close
    End If
    If (Winsock2.State <> sckClosed) Then
        Winsock2.Close
    End If
    Set obj = Nothing
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    MsgBox "有连接请求"
    If (Winsock1.State <> sckClosed) Then
        Winsock1.Close
    End If
    Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim data As String
    Winsock1.GetData data, vbString
    MsgBox data
    
    '收到消息后,给服务器端发成功消息
    sendSuccess
End SubPrivate Sub sendSuccess()
    Winsock2.RemoteHost = "192.168.88.170"
    Winsock2.RemotePort = 4602
    Winsock2.Connect
    Do
        DoEvents
    Loop Until Winsock2.State = sckConnected
    Winsock2.SendData "success"
End Sub

解决方案 »

  1.   

    Option Explicit
    Public Declare Function timeGetTime Lib "winmm.dll" () As Long
    '精确1/1000秒Public Function T1000(TimeGet As Long)
      Dim Time1 As Long
        Time1 = timeGetTime
        While timeGetTime - Time1 <= TimeGet
             DoEvents
        Wend
    End Function
    '**********************************************换成这样试试看!!    '只有收到客户端发过来的成功消息后,才关闭winsock
        Do
            CALL T1000(100)
        Loop Until frmTest.acceptMsg = "success"