实在不明白什么原因,求解!
这是一个局域网摄像头抓图传输到客服端显示的程序,用的是winsock,不明白为什么程序运行一段时间(大约40分钟)后会莫名的没了反应,winsock的所有事件都没有触发,找了很久都不明白什么原因,大家帮忙看看!
服务器端:
Private Sub Timer3_Timer()On Error Resume Next Timer3.Enabled = False If Video_Handle <> 0 Then Dim x As StdPicture Set x = CapturePicture(Video_Handle) SavePic Clipboard.GetData, FileName, "jpg" ' 压缩为jpg格式以减小图片 Winsock1.SendData "PS" End IfEnd SubPrivate Sub Winsock1_Close() If Winsock1.State <> sckClosed Then Winsock1.Close Winsock1.Listen End IfEnd SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long) If Winsock1.State <> sckClosed Then Winsock1.Close End If Winsock1.Accept requestID Timer3.Enabled = True Timer3.Interval = 1 End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)On Error Resume Next Static Cur_Pos As Long, FileLen As Long Dim strData As String, j Dim Buf() As Byte Winsock1.GetData strData Select Case Trim(strData) Case "Get_Picture" If Dir$(FileName) <> "" Then ' 找到该文件 Open FileName For Binary As #1 FileLen = LOF(1) ReDim Buf(1 To BlockSize) As Byte Get #1, , Buf Winsock1.SendData Buf Cur_Pos = BlockSize End If Case "Next_Block" If Cur_Pos >= FileLen Then Winsock1.SendData "EF" Close #1 Timer3.Enabled = True ' 数据传输完毕,开始抓图 Timer3.Interval = 10 Exit Sub End If j = Cur_Pos + BlockSize If j > FileLen Then j = FileLen - Cur_Pos Else j = BlockSize End If ReDim Buf(1 To j) As Byte Get #1, , Buf Winsock1.SendData Buf Cur_Pos = Cur_Pos + j End Select End Sub
Private Sub wskClientCamera_DataArrival(ByVal bytesTotal As Long) On Error Resume Next Static FileNum As Integer, FileLen As Long Dim Buf() As Byte Dim j As Integer ReDim Buf(bytesTotal) As Byte wskClientCamera.GetData Buf, vbByte If bytesTotal = 2 And Chr(Buf(0)) = "P" And Chr(Buf(1)) = "S" Then ' 准备接受图片 If Dir$(FileName) <> "" Then Kill FileName ' 找到该文件,则将其清除 FileNum = FreeFile Open FileName For Binary Access Write As #FileNum FileLen = 0 wskClientCamera.SendData "Get_Picture" ' 发送开始接受图片指令 Exit Sub End If If bytesTotal = 2 And Chr(Buf(0)) = "E" And Chr(Buf(1)) = "F" Then ' 图片传输完毕 Close #FileNum Me.picCamera.Picture = LoadPicture(FileName) ' 显示图片 Exit Sub End If Put #FileNum, , Buf wskClientCamera.SendData "Next_Block" FileLen = FileLen + bytesTotalEnd Sub
Private Sub Timer3_Timer()On Error Resume Next Timer3.Enabled = False If Video_Handle <> 0 Then Dim x As StdPicture Set x = CapturePicture(Video_Handle) SavePic Clipboard.GetData, FileName, "jpg" ' 压缩为jpg格式以减小图片 Winsock1.SendData "PS" Else MsgBox "这里出错了,所以没继续触发任何数据到达事件!" End IfEnd Sub
[解决办法]
建立一个友好的握手协议,一次性传输数据,比你这按快发送文件要好多了。而且可以避免出现上面所说的第二种情况