TCP & UDP

xayzmb 2004-12-20 09:57:14
下面是两段代码
分别是用TCP和UDP协议传送文件的
TCP不用拆包
UDP是拆包传送
两者有什么区别:

用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

上面是没有进行拆包,一次发送文件的程序,请问怎样在发送时拆包,接受时合并包?

UDP ************************************************************

Option Explicit
'==============================================
'===============================
'udp传文件
'客户端
'作者: 影子
'================================
'==============================================
Dim FileNumber As Integer '用来存文件的句柄
Dim LenFile As Long '文件的长度
Private Sub Command2_Click()
closefile
End Sub

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

Public Sub beginfile()
FileNumber = FreeFile '取得未使用的文件号
Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
End Sub

Public Sub closefile() '关闭文件句柄
Close #FileNumber
End Sub

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

Private Sub Form_Load()
frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
frmmain.Winsock0.RemotePort = 5698
Winsock0.Connect

End 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 = GetCount

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

Private 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
...全文
106 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xayzmb 2004-12-20
  • 打赏
  • 举报
回复
我只是不明白
为什么不用TCP传送而要那么麻繁用UCP传送呢?
UDP比TCP能节约多少资源呢???
zyg0 2004-12-20
  • 打赏
  • 举报
回复
tcp有自动找包的机制,因此不会丢包
xayzmb 2004-12-20
  • 打赏
  • 举报
回复
你说的我明白
那么是否用TCP传送就不会出现丢包或丢失数据库问题呢?
blackbug119 2004-12-20
  • 打赏
  • 举报
回复
传文件一般都是用TCP的UDP会丢包的
区别在于TCP是发送后等待接收方认证有无错误码,有错重发,支持数据包重新排列,UDP是发送后就不管接收方是否收到,收到后数据是否是有误,是不会数据包重排。
UDP会按数据包收到的时间排列
xayzmb 2004-12-20
  • 打赏
  • 举报
回复
msn和qq都不能用
在这里写好吗?
多谢!!!
zyg0 2004-12-20
  • 打赏
  • 举报
回复
忘了,最近msn尚不去握用qq
zyg0 2004-12-20
  • 打赏
  • 举报
回复
楼主有没有msn,我在短信给你留言了
行云边 2004-12-20
  • 打赏
  • 举报
回复
传输文件 还是使用 TCP吧

QQ使用 UDP的原因 小弟认为是为了穿透防火墙(或 NAT )吧。
helanshan 2004-12-20
  • 打赏
  • 举报
回复
up
gg137zeus 2004-12-20
  • 打赏
  • 举报
回复
up
xayzmb 2004-12-20
  • 打赏
  • 举报
回复
up

7,763

社区成员

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

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