用Winsock,TCP协议,传输文件时,代码如下:
'Send
Private Sub CmdSend_Click()
Dim myFile() As Byte
Dim lngFile As Long
Dim FileName As String
Static i As Single
FileName = VB.App.Path & "\my.gif"
lngFile = FileLen(FileName)
ReDim myFile(lngFile - 1) As Byte
Open FileName For Binary As #1
Get #1, , myFile
Close #1
WskClient.SendData myFile
End Sub'Receive
Private Sub WskServer_DataArrival(Index As Integer, ByVal bytestotal As Long)
Static i As Long
Dim myFile() As Byte
Dim myLong As Double
Dim myPath As String
myPath = VB.App.Path & "\my.gif"
ReDim myFile(0 To bytestotal - 1)
WskServer(Index).GetData myFile
Open myPath For Binary As #1
Put #1, lenth + 1, myFile
Close #1
lenth = lenth + UBound(myFile) - LBound(myFile) + 1
End Sub上面是没有进行拆包,一次发送文件的程序,请问怎样在发送时拆包,接受时合并包?
'Send
Private Sub CmdSend_Click()
Dim myFile() As Byte
Dim lngFile As Long
Dim FileName As String
Static i As Single
FileName = VB.App.Path & "\my.gif"
lngFile = FileLen(FileName)
ReDim myFile(lngFile - 1) As Byte
Open FileName For Binary As #1
Get #1, , myFile
Close #1
WskClient.SendData myFile
End Sub'Receive
Private Sub WskServer_DataArrival(Index As Integer, ByVal bytestotal As Long)
Static i As Long
Dim myFile() As Byte
Dim myLong As Double
Dim myPath As String
myPath = VB.App.Path & "\my.gif"
ReDim myFile(0 To bytestotal - 1)
WskServer(Index).GetData myFile
Open myPath For Binary As #1
Put #1, lenth + 1, myFile
Close #1
lenth = lenth + UBound(myFile) - LBound(myFile) + 1
End Sub上面是没有进行拆包,一次发送文件的程序,请问怎样在发送时拆包,接受时合并包?
解决方案 »
- 紧急求助,vb怎么没看到textbox???
- 关于ActiveReports做复杂报表
- 求救,VB连接Access2003的问题!
- 奉献出我的导出excel源代码,功能完美实现,就是速度有点慢,渴望各位老师给我指导一下,如何能提高速度.
- vb怎样调用页面设置对话框,并用所设定的参数进行打印
- VB两个字段排序问题!!
- maskcolor,usemaskcolor?
- VB自动填写网页下拉框式的年月日
- 高手帮忙!--如何获得硬件的标识ID?
- msflexgrid和mshflexgrid有什么区别?
- 50分急求!! TCP下在同一次事件触发中不能连续发生两次winsock.senddata事件~~~~~
- 如何判断execute方法是否执行成功呢?
要简单的话,程序不用动,把socket改成tcp一样传
'==============================================
'===============================
'udp传文件
'客户端
'作者: 影子
'================================
'==============================================
Dim FileNumber As Integer '用来存文件的句柄
Dim LenFile As Long '文件的长度
Private Sub Command2_Click()
closefile
End SubPrivate Sub Form_Load()
Winsock0.LocalPort = 5698
Winsock0.Listen
beginfile
End Sub
Private Sub Winsock0_ConnectionRequest(ByVal requestID As Long)
If Me.Winsock0.State <> sckClosed Then Me.Winsock0.Close
Me.Winsock0.Accept requestID
End Sub
Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim FileByte() As Byte
Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组
Dim mendByte() As Byte, i As Long, j As Long
Dim temp As String, temp1 As String
'获得包长
j = UBound(FileByte)
'合并包头
For i = 0 To 7 Step 2
temp = temp & Chr(FileByte(i))
Next
'比较长度看丢包没有
If Val(temp) = j Then ReDim mendByte(j - 8)
' 提出包头
For i = 0 To j - 8
mendByte(i) = FileByte(i + 7)
Next
' 写文件
Put #FileNumber, , mendByte
' 发送继续发送的请求
frmmain.Winsock0.SendData "ok"
Else
'出现丢包,请求重发
frmmain.Winsock0.SendData "no"
End If
End SubPublic Sub beginfile()
FileNumber = FreeFile '取得未使用的文件号
Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
End SubPublic Sub closefile() '关闭文件句柄
Close #FileNumber
End SubOption Explicit
Dim GetFileNum As Integer
Dim LenFile As Long
Dim Sendbaye() As Byte '发送的包
'===============================
'udp传文件
'作者: 影子
'服务器端
'================================
Private Sub Command1_Click()
GetFileNum = FreeFile '取得未使用的文件号
LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度
Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件
Command1.Enabled = False
' 传送文件
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Text1.Text = Now
End SubPrivate Sub Form_Load()
frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
frmmain.Winsock0.RemotePort = 5698
Winsock0.ConnectEnd Sub
'=========================================================================
'为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据
'==========================================================================
Private Function SplitFile() As Long '拆包
On Error Resume Next
Dim GetCount As Long
'计算出这次可发送的字节数
If LenFile >= 4000 Then
GetCount = 4000
LenFile = LenFile - GetCount
Else
GetCount = LenFile
LenFile = LenFile - GetCount
End If
SplitFile = GetCountEnd Function
Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long)
Dim FileByte() As Byte, i As Long, j As Long
Dim temp As String
ReDim Sendbaye(0)
Dim tempa As String * 4
ReDim FileByte(SendLen - 1)
tempa = SendLen + 7
Sendbaye = tempa ' 把长度负值给包头
Get #FileNumber, , FileByte '读取文件
ReDim Preserve Sendbaye(SendLen + 7) '把包头+到文件头
For i = 0 To UBound(FileByte)
Sendbaye(i + 7) = FileByte(i)
Next
frmmain.Winsock0.SendData Sendbaye
End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim str As String
frmmain.Winsock0.GetData str
Select Case str
Case "ok"
'成功继续发送
If LenFile = 0 Then '发送完成
MsgBox "成功"
Exit Sub
End If
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Case "no"
'不成功重发上一个包
frmmain.Winsock0.SendData Sendbaye
End Select
End Sub
Option Explicit
'==============================================
'===============================
'udp传文件
'客户端
'作者: 影子
'================================
'==============================================
Dim FileNumber As Integer '用来存文件的句柄
Dim LenFile As Long '文件的长度
Private Sub Command2_Click()
closefile
End SubPrivate Sub Form_Load()
Winsock0.LocalPort = 5698
Winsock0.Listen
beginfile
End SubPrivate Sub Winsock0_ConnectionRequest(ByVal requestID As Long)
If Me.Winsock0.State <> sckClosed Then Me.Winsock0.Close
Me.Winsock0.Accept requestID
End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim FileByte() As Byte
Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组
' 写文件
Put #FileNumber, , FileByte,
' 发送继续发送的请求
frmmain.Winsock0.SendData "ok"End SubPublic Sub beginfile()
FileNumber = FreeFile '取得未使用的文件号
Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
End SubPublic Sub closefile() '关闭文件句柄
Close #FileNumber
End SubOption Explicit
Dim GetFileNum As Integer
Dim LenFile As Long
Dim Sendbaye() As Byte '发送的包
'===============================
'udp传文件
'作者: 影子
'服务器端
'================================
Private Sub Command1_Click()
GetFileNum = FreeFile '取得未使用的文件号
LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度
Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件
Command1.Enabled = False
' 传送文件
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Text1.Text = Now
End SubPrivate Sub Form_Load()
frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
frmmain.Winsock0.RemotePort = 5698
Winsock0.ConnectEnd Sub
'=========================================================================
'为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据
'==========================================================================
Private Function SplitFile() As Long '拆包
On Error Resume Next
Dim GetCount As Long
'计算出这次可发送的字节数
If LenFile >= 4000 Then
GetCount = 4000
LenFile = LenFile - GetCount
Else
GetCount = LenFile
LenFile = LenFile - GetCount
End If
SplitFile = GetCountEnd Function
Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long)
Dim FileByte() As Byte
Dim tempa As String * 4
ReDim FileByte(SendLen - 1)
Get #FileNumber, , FileByte '读取文件
frmmain.Winsock0.SendData FileByte
End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim str As String
frmmain.Winsock0.GetData str
Select Case str
Case "ok"
'成功继续发送
If LenFile = 0 Then '发送完成
MsgBox "成功"
Exit Sub
End If
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)End Select
End Sub
分成7K一个包。在包头加入一标记:如:是数据包(1byte),包的顺序(2byte),后面就是数据了。
接收时,就可以按标记重组了。