说明:我在Activex DLL中有个方法供客户调用,作用是用服务器端的winsokc1连接客户端的winsock1,连接成功后发条消息给客户端的winsock1,客户端的winsock1收到服务器端的消息后,客户端的winsock2连接服务器端的winsock2,然后给他发给成功的消息,到此dll中的方法执行完后,最终把服务器端的两个socket关闭。
出现的问题:我把dll和测试工程作为工程组一起执行,完全ok,把dll发布com+控件调用时,代码中只用到一个doEvents函数时调用也正常,若用到两个doEvents就会出现问题,个人觉得好像执行时造成冲突了,所以有死锁现象出现。 出现问题的代码:
Do
DoEvents
Loop Until frmTest.wnsAcceptReq.State = sckConnected
frmTest.wnsAcceptReq.SendData "发送给" & sCliIP & "的" & sCliPort & "端口的数据"
'只有收到客户端发过来的成功消息后,才关闭winsock
Do
DoEvents
Loop Until frmTest.acceptMsg = "success" 全部代码如下:
服务器端:
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
出现的问题:我把dll和测试工程作为工程组一起执行,完全ok,把dll发布com+控件调用时,代码中只用到一个doEvents函数时调用也正常,若用到两个doEvents就会出现问题,个人觉得好像执行时造成冲突了,所以有死锁现象出现。 出现问题的代码:
Do
DoEvents
Loop Until frmTest.wnsAcceptReq.State = sckConnected
frmTest.wnsAcceptReq.SendData "发送给" & sCliIP & "的" & sCliPort & "端口的数据"
'只有收到客户端发过来的成功消息后,才关闭winsock
Do
DoEvents
Loop Until frmTest.acceptMsg = "success" 全部代码如下:
服务器端:
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
Do
DoEvents
Loop Until
這個循環中間,還是一個條件不滿足。就象我曾經在數據庫中間用for..next刪除數據會全部刪除,do...loop 確剩下一筆,原因就是條件沒有滿足,當時候看著條件滿足,但是還是沒有滿足,所以還是條在裡面沒有離開了我這個也隻是個人看法,可能是錯的