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