实在不明白什么原因,求解!

ArmStronger 2010-04-09 10:31:55
这是一个局域网摄像头抓图传输到客服端显示的程序,用的是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 If
End Sub

Private Sub Winsock1_Close()
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock1.Listen
End If
End Sub

Private 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 Sub

Private 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 + bytesTotal
End Sub
...全文
123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jim88888888 2010-04-10
  • 打赏
  • 举报
回复
FileName未定义???定义为什么数据?
jim88888888 2010-04-10
  • 打赏
  • 举报
回复
Private 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
这里看不懂~能不能解释一下指令啊??!!!谢谢拉~
jim88888888 2010-04-10
  • 打赏
  • 举报
回复
看不明白~能不能解释当中的指令呢??
ArmStronger 2010-04-09
  • 打赏
  • 举报
回复
谢谢楼上的,我再试试看
倒大霉的上帝 2010-04-09
  • 打赏
  • 举报
回复
建立一个友好的握手协议,一次性传输数据,比你这按快发送文件要好多了。而且可以避免出现上面所说的第二种情况
倒大霉的上帝 2010-04-09
  • 打赏
  • 举报
回复
关注下Video_Handle变量,很可能是Timer3中出问题。改一下:


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 If
End Sub


另外有一点,虽然出问题可能性非常非常小,但也并不是完完全全就不会出问题的地方:

wskClientCamera.GetData Buf, vbByte
If bytesTotal = 2 And Chr(Buf(0)) = "P" And Chr(Buf(1)) = "S" Then ……
If bytesTotal = 2 And Chr(Buf(0)) = "E" And Chr(Buf(1)) = "F" Then ……


当最后一次传图片文件只有2个字节,并且刚好是PS或EF对应的ASCII码时,客户端就会出问题了,虽然有错误处理,但是没办法再次触发任何数据到达事件。
东方之珠 2010-04-09
  • 打赏
  • 举报
回复
老是眨眼晴,没有微笑,不好!
ArmStronger 2010-04-09
  • 打赏
  • 举报
回复
问题解决了,谢谢楼上各位

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧