當前位置:編程學習大全網 - 源碼下載 - 利用UDP實現可靠傳輸

利用UDP實現可靠傳輸

如何用vb的winsocket解決udp文件傳輸中的丟包問題

Udp是1無連接協議。與tcp相比,UDP存在傳輸速度快、占用資源少的問題。

但是由於udp沒有自動找包的功能,經常會出現丟包的情況,會造成傳輸文件的丟包。

由於時間倉促,水平有限,我沒有優化效率,只是簡單的實現了壹下。請自行閱讀源代碼。

註意事項:

主要功能:將文件猜測成4k大小的包,接受包頭上的1個包,判斷長度是否與接受長度匹配。

如果符合要求,繼續發送,如果有丟包,則從。

希望大家有什麽好的建議可以告訴我,我會努力改進的。

選項顯式

'==============================================

'===============================

Udp文件傳輸

客戶

作者:影子

'================================

'==============================================

“Dim FileNumber As Integer”用於存儲文件的句柄。

Dim LenFile作為Long' file的長度。

私有子命令2_Click()

關閉文件

末端接頭

私有子窗體_Load()

Winsock0。本地端口= 5698

Winsock0。約束

beginfile

末端接頭

私有Sub Winsock 0 _ data arrival(ByVal bytes total As Long)

Dim FileByte()為字節

Winsock 0。' getdatafile byte,vbarray+vbbyte '接收類型為:字節數組。

Dim mendByte()為字節,I為長,j為長

Dim temp為字符串,temp1為字符串

獲取包裝長度

j = UBound(文件字節)

合並包頭

對於i = 0至7,步驟2

溫度=溫度& amp文件字節(I)

然後

比較長度,看有沒有丟包。

如果Val(temp) = j,則

雷迪姆·門德拜特(j - 8)

提出包頭

對於i = 0至j - 8

mendByte(i) = FileByte(i + 7)

然後

寫文件

放入#FileNumber,,mendByte

發送繼續發送的請求

弗曼。Winsock 0 . send data“ok”

其他

丟包,請求重傳。

弗曼。Winsock0.SendData "no "

如果…就會結束

末端接頭

Public Sub beginfile()

FileNumber = FreeFile '來獲取未使用的文件號。

打開“c: \ aaa.exe”的二進制作為#文件編號'打開文件。

末端接頭

Public Sub closefile()'關閉文件句柄。

關閉#FileNumber

末端接頭

選項顯式

Dim GetFileNum為整數

Dim LenFile As Long

Dim Sendbaye()以字節形式發送的數據包

'===============================

Udp文件傳輸

作者:影子

服務器端

'================================

私有子命令1_Click()

“GetFileNum = FreeFile”來獲取未使用的文檔編號。

LenFile = FileLen("d:\aa.rar ")'獲取要傳輸的文件的長度。

當# getfilenum '打開要傳輸的文件時,打開二進制文件“d: \ aa.rar”。

命令1。啟用=假

傳輸文件

調用TCPSendFile(frmmain。Winsock0,GetFileNum,SplitFile)

Text1。文本=現在

末端接頭

私有子窗體_Load()

frmmain . Winsock 0 . remote host = " 192.168.0 . 12 " '服務器ip。

弗曼。Winsock0.RemotePort = 5698

末端接頭

'=========================================================================

為了清楚起見,下面兩個子過程用於計算這次可以傳輸多少字節的數據並傳輸數據。

'==========================================================================

私有函數將文件()拆分為long '解包

出錯時繼續下壹步

Dim GetCount As Long

計算這次可以發送的字節數。

If LenFile & gt那麽= 4000

GetCount = 4000

LenFile = LenFile - GetCount

其他

GetCount = LenFile

LenFile = LenFile - GetCount

如果…就會結束

SplitFile = GetCount

結束功能

private Sub TCP sendfile(objWinSock為WinSock,FileNumber為Integer,SendLen為Long)

Dim FileByte()為字節,I為長,j為長

字符串形式的Dim temp

雷迪姆·森巴耶(0)

Dim tempa作為字符串* 4

ReDim文件字節(SendLen - 1)

tempa = SendLen + 7

Sendbaye = tempa '給包頭壹個負的長度。

獲取#FileNumber,,FileByte '讀取文件。

redim preserve send baye(send len+7)'將文件頭添加到文件頭。

對於i = 0至下界(文件字節)

Sendbaye(i + 7) = FileByte(i)

然後

弗曼。Winsock0.SendData Sendbaye

末端接頭

私有Sub Winsock 0 _ data arrival(ByVal bytes total As Long)

Dim字符串作為字符串

弗曼。Winsock0.GetData字符串

選擇案例字符串

案例“ok”

繼續發送成功。

如果LenFile = 0,則發送完成。

MsgBox“成功”

出口接頭

如果…就會結束

調用TCPSendFile(frmmain。Winsock0,GetFileNum,SplitFile)

案例“否”

無法重新發送最後壹個包。

弗曼。Winsock0.SendData Sendbaye

結束選擇

末端接頭

參考資料:

/s?wd=zyg0 udp

  • 上一篇:吸收過程分離指標用什麽表示
  • 下一篇:雲陽網站源代碼
  • copyright 2024編程學習大全網