此断代码是c/s的客户端,发送接收用的是同一个winsok1
winsock用的是TCP/IP协议
private sendfile()
................
'折包发送文件
For i = 0 To LngFile
ReDim FileByte(1023) As Byte
Open sFile For Binary As #FileNum
Get #FileNum, i * 1024 + 1, FileByte
Close #FileNum
winsok1.SendData FileByte
Call Delay(100) '延时
Next.................
end sub
Private Sub winsok1_DataArrival(ByVal bytesTotal As Long)
##################奇怪的现象
当调用sendfile()发送文件时,如果文件没有发送完,这时winsok1如果收到 发过来的消息,会DataArrival事件,但读这个消息,发现还是在发送文件之前,收到的那条旧消息,
直接文件发送完毕,又会再一次触发DataArrival,才能得到后来收到的消息,什么原因?
End Sub
Public Function Delay(ByVal n As Long)
Dim T1 As Long, T2 As Long
T1 = GetTickCount: T2 = GetTickCount
Do Until T2 - T1 >= n
T2 = GetTickCount: DoEvents: Sleep 1
Loop
End Function
winsock用的是TCP/IP协议
private sendfile()
................
'折包发送文件
For i = 0 To LngFile
ReDim FileByte(1023) As Byte
Open sFile For Binary As #FileNum
Get #FileNum, i * 1024 + 1, FileByte
Close #FileNum
winsok1.SendData FileByte
Call Delay(100) '延时
Next.................
end sub
Private Sub winsok1_DataArrival(ByVal bytesTotal As Long)
##################奇怪的现象
当调用sendfile()发送文件时,如果文件没有发送完,这时winsok1如果收到 发过来的消息,会DataArrival事件,但读这个消息,发现还是在发送文件之前,收到的那条旧消息,
直接文件发送完毕,又会再一次触发DataArrival,才能得到后来收到的消息,什么原因?
End Sub
Public Function Delay(ByVal n As Long)
Dim T1 As Long, T2 As Long
T1 = GetTickCount: T2 = GetTickCount
Do Until T2 - T1 >= n
T2 = GetTickCount: DoEvents: Sleep 1
Loop
End Function
哪们老大解析一下?!
Dim SeqByteArray() As Byte '全局变量Private Sub smsClient_DataArrival(ByVal bytesTotal As Long) Dim TempByteArray() As Byte
Dim RemainByteArray() As Byte
Dim sDateByte() As Byte
'全部读取缓冲区中的数据
smsClient.GetData sDateByte, vbArray + vbByte, bytesTotal
If StrPtr(SeqByteArray) = 0 Then
'没有初始化
ReDim SeqByteArray(UBound(sDateByte))
CopyMemory SeqByteArray(0), sDateByte(0), UBound(sDateByte) + 1
Else
'己经初始化
Dim SeByteArrayUbound As Long
SeByteArrayUbound = UBound(SeqByteArray)
ReDim Preserve SeqByteArray(SeByteArrayUbound + UBound(sDateByte) + 1)
CopyMemory SeqByteArray(SeByteArrayUbound + 1), sDateByte(0), UBound(sDateByte) + 1
End If
'数据包的长度
Dim PakLenByte(3) As Byte
Dim PakLenByteLen As Integer
If UBound(SeqByteArray) >= 3 Then
CopyMemory PakLenByte(0), SeqByteArray(0), 4
PakLenByteLen = ByteArrayToInt(PakLenByte)
Else
Exit Function
End If
Do While (PakLenByteLen <= UBound(SeqByteArray) + 1)
'开始拆包
ReDim TempByteArray(0 To PakLenByteLen - 1) As Byte
CopyMemory TempByteArray(0), SeqByteArray(0), PakLenByteLen
'得到一个完整的包,对消息进行分类处理分析
Call DataAnalytic(TempByteArray)
Erase TempByteArray '################清理内存
'把剩余的字节,重新放回SeqByteArray中
If UBound(SeqByteArray) + 1 - PakLenByteLen > 0 Then
'说明有取走该包之后,还有其他包的数据
ReDim RemainByteArray(UBound(SeqByteArray) + 1 - PakLenByteLen - 1)
CopyMemory RemainByteArray(0), SeqByteArray(PakLenByteLen), UBound(SeqByteArray) + 1 - PakLenByteLen
ReDim SeqByteArray(UBound(SeqByteArray) + 1 - PakLenByteLen - 1)
CopyMemory SeqByteArray(0), RemainByteArray(0), UBound(RemainByteArray) + 1
Erase RemainByteArray '######################清理内存
'重新计算包的长度
If UBound(SeqByteArray) >= 3 Then
CopyMemory PakLenByte(0), SeqByteArray(0), 4
PakLenByteLen = ByteArrayToInt(PakLenByte)
Else
Exit Do '退出循环
End If
Else
Erase SeqByteArray '清除占用的内存地址
Exit Do '退出循环
End If
Loop
End Function
各位大哥帮看看,哪有问题,多谢