问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用UDP实现可靠传输

发布网友 发布时间:2022-04-22 21:51

我来回答

4个回答

热心网友 时间:2023-09-12 20:03

如何用vb的winsocket解决udp文件传送丢包的问题

udp协议是1种无连接的协议,他和tcp协议比较有传输速度快,占用资源少的问题。
但是由于udp协议本身没有自动找包的功能,因此经常会出现丢包的现象,会造成传送的文件丢包的现象
因为时间匆忙和水平有限,本人在效率上没有作优化,只是简单的实现,请大家自己看源码吧
注释:
主要功能:把文件猜成4k大小的包 在包头+上包的长度 接受了1个包判断长度是否和接受的长度相符如果

符合那么就继续发,如果出现丢包那么就从发
希望大家有什么好的建议通知我,我会尽量完善的
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.Bind
beginfile
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

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

参考资料:http://www.baidu.com/s?wd=zyg0 udp

热心网友 时间:2023-09-12 20:04

既然你要可靠传输,为什么还要用UDP

换成TCP不就有保证了吗

如果你自己写代码来保证,其实只是重复了一遍tcp的过程而已,tcp本身就是在不可靠的IP上实现可靠的数据传输

而且tcp协议及其实现已经经过了长时间的实践检验

如果你是学习目的,就去找个tcp的源码看看就可以了

热心网友 时间:2023-09-12 20:04

你会写发送/接收UDP吧,关于可靠传输,不太容易找到现成的跟应用可以脱离开的代码给你。
不过思路都是一样。
发送UDP到对方,对方收到,发送一个UDP包,确认一下,然后你再发。

热心网友 时间:2023-09-12 20:05

bu z
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我想下个好点的股市行情软件,光大证券金阳光app怎么样啊? 股票行情软件下载选哪个比较好?光大证券的金阳光app怎么样? 光大证券开户APP是什么 光大用什么炒股软件 家里房顶漏水怎么办 房顶漏水最好补漏方法 中石化薪资揭秘(天津、海南、镇海、中科、茂名) 专科生在茂名石化待遇怎样 茂名石化正式工待遇怎么样 茂名石化待遇如何 729-08胶皮是内能的吗 文件传输协议的简称是什么? 文件传输都是FTP协议吗? 下列协议中能够实现文件可靠传输的协议是? 11位字节协议如何实现字节传输的可靠性 两台笔记本之间快速传输大量文件有哪些? 如何保证文件线上传输的安全性? 考健康管理师有没有用? 非医学专业考健康管理师可以从事什么行业? 非专业从业人员考健康管理师证书作用大吗? 健康管理师非医学专业可以报考吗? 非医学类专业考了健康管理师以后可以从事相关工作吗? 健康管理师非医学专业能考吗?考试难度怎么样? 健康管理师适合非医学专业吗? 健康管理师有专业限制吗?其他专业可以报考吗,非医学类专业 请问不是医学专业考健康管理师能干什么? 健康管理师适合非医学专业考生吗 非医学专业考生报考健康管理师证书有用吗? 考健康管理师到底有用吗? 大专非专业可以报考健康管理师吗? 非医学类专业考健康管理师有用吗? 灰枣和枸杞还有姜片在一起煮起到什么功效? 跨国传输大容量文件,有什么靠谱的方法? 青枣、灰枣、黑枣,在营养上有什么区别吗? 求推荐比较好的大文件传输工具,最好是安全性高点的,谢谢~ 文件传输是什么啊? 灰枣和葡萄干怎么一起泡水? 发送大文件用什么传输软件好? 喝枸杞红枣水有什么好处 如何利用MQ实现大文件传输和交换具有可靠,安全 帮忙推荐几款 企业级的文件传输 linux 工具,可以安全、可靠传输大量文件。谢谢。 玫瑰红枣枸杞泡水有什么功效与作用 可靠UDP 组播 文件传输 国家批准的大枣之乡都有哪些? 在UDP传输文件时,在可靠的前提下如何提高传输速度 红枣,枸杞,玫瑰花,蜂蜜可以一起泡水喝吗?有什么功效? 局域网传输文件使用什么协议比较合适 文件传输FTP的工作原理是什么啊? 红枣和啥一起熬稀饭 信息传输的保密性、交易文件的完整性、信息的不可否认性、交易者身份的确定性分别采用哪些技术来保证? 吃哪种红枣补血效果比较好?