|
5. 媒體服務(wù)傳輸控件 1) 類型 - 多播 一對(duì)多的文件傳輸, 接受者"監(jiān)聽(tīng)"同一個(gè)多播IP地址和端口來(lái)接收文件. - 單播 一對(duì)一的文件傳輸, 接受者"監(jiān)聽(tīng)"多個(gè)IP地址之一和同一個(gè)斷開(kāi)來(lái)接收文件.
2) 完全可靠性服務(wù) 文件傳輸組件實(shí)現(xiàn)了一個(gè)多播的完全可靠性服務(wù)保證每一個(gè)數(shù)據(jù)包被收到, 保持不被破壞和完整. 如果接受者發(fā)現(xiàn)數(shù)據(jù)包丟失和損壞, 可以發(fā)送一個(gè)NAK到發(fā)送者請(qǐng)求數(shù)據(jù)包重發(fā).
在完全可靠性服務(wù)模式下, 文件傳輸服務(wù)執(zhí)行一個(gè)流控制; 這是對(duì)于速度控制的額外支持. 如果發(fā)送者傳輸數(shù)據(jù)包過(guò)快, 接受者發(fā)送一個(gè)扼殺NAK提示傳輸速度必須下降. 接受者也在忙和無(wú)法接收更多數(shù)據(jù)包或者一段時(shí)間沒(méi)有收到數(shù)據(jù)包的時(shí)候發(fā)送空閑 NAK.
文件傳輸控件使用完全可靠性服務(wù)模式作為缺省模式. 如果發(fā)送者不實(shí)用該模式, 控件依舊可以接收回傳只是無(wú)法請(qǐng)求重傳數(shù)據(jù)包. 完全可靠性服務(wù)可以通過(guò) FullyReliableService 屬性關(guān)閉.
雙向網(wǎng)要求完全可靠服務(wù).
完全可靠服務(wù)模式要求使用錯(cuò)誤轉(zhuǎn)發(fā)機(jī)制(FEC).
【相關(guān)控制消息】 - NAK 是一個(gè)發(fā)送自接收端到發(fā)送端的數(shù)據(jù), 提示數(shù)據(jù)包被放棄. 是一個(gè)請(qǐng)求重發(fā)數(shù)據(jù)包的消息. 使用它是一個(gè)有效地方式添加可信度, 因?yàn)榻邮苷咧恍枰邮漳切](méi)有被接收的數(shù)據(jù)包. - Throttle NAK 來(lái)自接收端的請(qǐng)求, 提示發(fā)送端降低帶寬. 被完全可靠服務(wù)使用. - Idle NAK 來(lái)自接收端的請(qǐng)求, 提示發(fā)送端在數(shù)據(jù)包沒(méi)有收到, 且傳輸不完整. 發(fā)送端收到的時(shí)候等待其他接收端NKAs來(lái)重發(fā)請(qǐng)求的數(shù)據(jù)包.
3) 接收文件 方式: 1. 在發(fā)送者發(fā)送文件之前, 啟動(dòng)一個(gè)接收操作確保所有的文件被傳輸. 如果接收操作在發(fā)送到已經(jīng)開(kāi)始發(fā)送一組文件后開(kāi)始, 接收端接收當(dāng)前文件和其余文件. 如果接收動(dòng)作在發(fā)送途中開(kāi)始, 接收端接收該文件. 2. 使用 FtsStartFileTransferReceive 方法接收文件. 稱之為監(jiān)聽(tīng). 針對(duì)多播傳輸, 使用一個(gè)多播地址. 針對(duì)多播傳輸使用主機(jī)的本地地址之一, 如果沒(méi)有指定本地地址, 第一個(gè)主機(jī)本地地址缺省使用. 接收端可以取消一個(gè)文件接收(FtsCancelFileTransferReceive). 狀態(tài)和進(jìn)度可以通過(guò)事件和屬性在文件傳輸期間獲得.
4) 狀態(tài)提示 FtsOnTransferStarted FtsOnTransferCompleted FtsOnFileTransferStarted FtsOnFileTransferCompleted FtsOnStatusChanged
5) 進(jìn)度提示 要獲得文件傳輸信息, 使用 FtsRegisterStatusCallback 注冊(cè)需要的傳輸信息. 典型的請(qǐng)求包括 - 每100KB提示一次, 獲則每10%提示一次.
提示也可以請(qǐng)求關(guān)于接收的數(shù)據(jù)包個(gè)數(shù), 虛假數(shù)據(jù)包個(gè)數(shù)( 從同一個(gè)IP地址和端口獲得, 但是不是需要的文件部分), 重復(fù)數(shù)據(jù)包, 丟失數(shù)據(jù)包等. 進(jìn)度提示由 FtsOnTransferProgress 事件處理. 讀取正確的屬性, 然后在事件處理子程序中采取正確的處理. 通過(guò)調(diào)用 FtsRevokeStatusCallback 方法可以宣告一個(gè)提示無(wú)效.
進(jìn)度通告只在 FtsOnTransferProgress 時(shí)間上觸發(fā). 傳輸進(jìn)度屬性值 (諸如: NumPacketsDropped)總是有效地.
6) 如何使用 <OBJECT ID="NSFile" WIDTH="100" HEIGHT="51" CLASSID="CLSID:26F24A93-1DA2-11D0-A334-00AA004A5FC5" CODEBASE="http://activex.microsoft.com/activex/controls/mplayer/en/nsftsinf.cab#Version=3,0,0,2700"></OBJECT>
<!-- 一個(gè)接收文件的例子, 附帶進(jìn)度顯示 --> <SCRIPT LANGUAGE="VBScript"> <!-- Sub BtnReceiveFile_OnClick MyForm.Noise.Value = 0 MyForm.Redundancy.Value = 0 call nsfile1.FtsRegisterStatusCallback(0, 0, 4096, 4096, 0, 0, 0, 0, 0, 0, 0) On Error Resume Next call nsfile1.FtsStartFileTransferReceive("239.230.50.50", 5050, "", "%TEMP%\", 0, 1025) IfErr.Number Then MsgBox "Start Error = " & ReturnError(Err.Number) End Sub
Sub BtnCancelFile_OnClick call nsfile1.FtsCancelFileTransferReceive MsgBox "Transfer Cancelled. Error = " & ReturnError(nsfile1.Result) End Sub
Sub nsfile1_FtsOnTransferProgress MyForm.TotalBytes.Value = nsfile1.NumTotalBytesTransferred MyForm.DataBytes.Value = nsfile1.NumTotalDataBytesTransferred MyForm.Packets.Value = nsfile1.NumPacketsTransferred MyForm.Bogus.Value = nsfile1.NumBogusPacketsReceived End Sub
Sub nsfile1_FtsOnTransferCompleted MsgBox "Transfer Completed. Error = " & ReturnError(nsfile1.Result) TotalBytes = nsfile1.NumTotalBytesTransferred if TotalBytes > 0 then DataBytes = nsfile1.NumTotalDataBytesTransferred MyForm.Redundancy.Value = Int(((TotalBytes - DataBytes)/TotalBytes)*100) Packets = nsfile1.NumPacketsTransferred Bogus = nsfile1.NumBogusPacketsReceived MyForm.Noise.Value = Int(Bogus/Packets) MyForm.TotalBytes.Value = nsfile1.NumTotalBytesTransferred MyForm.DataBytes.Value = nsfile1.NumTotalDataBytesTransferred MyForm.Packets.Value = nsfile1.NumPacketsTransferred MyForm.Bogus.Value = nsfile1.NumBogusPacketsReceived end if End Sub
Sub BtnAbout_OnClick call nsfile1.AboutBox() End Sub
Function ReturnError(ByVal ErrNum) Select Case ErrNum Case 0 ErrString = "No Error" Case 1 ErrString = "Already Requested" Case -2147467260 ErrString = "Cancelled" Case -2147467259 ErrString = "Failed" Case -2147287038 ErrString = "File Not Found" Case -2147024882 ErrString = "Out Of Memory" Case -2147024809 ErrString = "Invalid Parameter" Case -2147023436 ErrString = "Timed Out" Case Else ErrString = "Unknown Error " & CStr(Hex(ErrNum)) End Select ReturnError = ErrString End Function
--> </SCRIPT>
<!-- 一個(gè)完整的接收文件例子 --> <HTML> <HEAD><TITLE>Total FTS Demo</TITLE> <link rel="stylesheet" type="text/css" href="../msdn_ie4.css"> </HEAD> <BODY BGCOLOR="#FFFFFF">
<H2>Total File Transfer Service Demo</H2>
<OBJECT ID="nsfile1" CODEBASE="http://activex.microsoft.com/activex/controls/mplayer/en/nsftsinf.cab#Version=3,0,0,2700" CLASSID="CLSID:26F24A93-1DA2-11D0-A334-00AA004A5FC5" ALIGN="RIGHT" HEIGHT="10" WIDTH="10"> <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="2646"> <PARAM NAME="_ExtentY" VALUE="1323"> <PARAM NAME="_StockProps" VALUE="0"> </OBJECT>
<FORM NAME="MyForm"> <TABLE> <TR> <TD><B>Source IP:</B></TD><TD><INPUT TYPE="TEXT" NAME="IPAddr" VALUE="239.230.50.50"></TD> <TD><B>Source port:</B></TD><TD><INPUT TYPE="TEXT" NAME="IPPort" VALUE="5050" SIZE="6"></TD> <TD><B>Filter:</B></TD><TD><INPUT TYPE="TEXT" NAME="Filter"></TD> </tr> </TABLE> <HR SIZE=1>
<TABLE> <TR> <TD><B>Path:</B></TD><TD><INPUT TYPE="TEXT" NAME="FilePath" VALUE="%TEMP%\"></TD> <TD><B>Attributes:</B></TD><TD><INPUT TYPE="TEXT" NAME="Attributes" VALUE="0"></TD> <TD><B>Flags:</B></TD><TD><INPUT TYPE="TEXT" NAME="Flags" VALUE="1025"></TD> </TR> </TABLE> <HR SIZE=1>
<TABLE> <TR> <TD><INPUT TYPE="BUTTON" NAME="BtnReceiveFile" VALUE="Start receive"></TD> <TD><INPUT TYPE="BUTTON" NAME="BtnCancelFile" VALUE="Cancel"></TD> <TD><INPUT TYPE="BUTTON" VALUE="About FTS" NAME="BtnAbout"></TD> <TD WIDTH="25"></TD> <TD WIDTH="50"><INPUT TYPE="TEXT" NAME="Routing"></TD> <TD WIDTH="25"></TD> <TD ALIGN="RIGHT" WIDTH="75"><B>Start time:</B></TD> <TD WIDTH="150"><INPUT TYPE="TEXT" NAME="StartTime"></TD> </TR> </TABLE> <HR SIZE=1>
<TABLE> <TR> <TD><B>Files:</B></TD><TD><INPUT TYPE="TEXT" NAME="NumFiles" SIZE="5"></TD> <TD><B>Percent file:</B></TD><TD><INPUT TYPE="TEXT" NAME="PerFileData" SIZE="30"></TD> <TD><B>Time taken:</B></TD><TD><INPUT TYPE="TEXT" NAME="MyTime"></TD> </TR> </TABLE> <HR SIZE=1>
<TABLE> <TR> <TD><B>Current file:</B></TD><TD><INPUT TYPE="TEXT" NAME="CurrFile" SIZE="30"></TD> <TD><B>Size:</B></TD><TD><INPUT TYPE="TEXT" NAME="CurrSize" SIZE="16"></TD> <TD><B>Attributes:</B></TD><TD><INPUT TYPE="TEXT" NAME="CurrAttr" SIZE="6"></TD> </TR> </TABLE> <HR SIZE=1>
<TABLE> <TR> <TD><B>Total bytes:</B></TD><TD><INPUT TYPE="TEXT" NAME="TotalBytes"></TD> <TD><B>Data bytes:</B></TD><TD><INPUT TYPE="TEXT" NAME="DataBytes"></TD> </TR> <TR> <TD><B>Packets:</B></TD><TD><INPUT TYPE="TEXT" NAME="Packets" SIZE="8"></TD> <TD><B>Bogus:</B></TD><TD><INPUT TYPE="TEXT" NAME="Bogus" SIZE="8"></TD> <TD><B>Drop:</B></TD><TD><INPUT TYPE="TEXT" NAME="PackDrop" SIZE="8"></TD> </tr> <TR> <TD><B>Corr:</B></TD><TD><INPUT TYPE="TEXT" NAME="PackCorr" SIZE="8"></TD> <TD><B>Dupes:</B></TD><TD><INPUT TYPE="TEXT" NAME="PackDup" SIZE="8"></TD> </TR> </TABLE> <HR SIZE=1>
<TABLE> <TR> <TD><B>Source path:</B></TD><TD><INPUT TYPE="TEXT" NAME="SrcPath" SIZE="35"></TD> </tr> <TR> <TD><B>Destination path:</B></TD><TD><INPUT TYPE="TEXT" NAME="DestPath" SIZE="35"></TD> </TR>
<TR> <TD><B>Endpoint address:</B></TD><TD><INPUT TYPE="TEXT" NAME="EndAddr" SIZE="16"></TD> <TD><B>Endpoint port:</B></TD><TD><INPUT TYPE="TEXT" NAME="EndPort" SIZE="8"></TD> </TR>
<TR> <TD><B>Source addresss:</B></TD><TD><INPUT TYPE="TEXT" NAME="SrcAddr" SIZE="16"></TD> <TD><B>Source port:</B></TD><TD><INPUT TYPE="TEXT" NAME="SrcPort" SIZE="8"></TD> </TR>
<TR> <TD><B>Local address:</B></TD><TD><INPUT TYPE="TEXT" NAME="LocAddr" SIZE="16"></TD> <TD><B>Local port:</B></TD><TD><INPUT TYPE="TEXT" NAME="LocPort" SIZE="8"></TD> </tr> <TR> <TD><B>Local port used:</B></TD><TD><INPUT TYPE="TEXT" NAME="LastPort" SIZE="16"></TD> </TR> </TABLE> <HR SIZE=1>
</FORM>
<SCRIPT LANGUAGE="VBScript"> <!-- Sub BtnReceiveFile_OnClick On Error Resume Next '--- Initialize form values. MyForm.MyTime.Value = "" MyForm.StartTime.Value = "" MyForm.NumFiles.Value = "" MyForm.PerFileData.Value = "" MyForm.TotalBytes.Value = "" MyForm.DataBytes.Value = "" MyForm.CurrFile.Value = "" MyForm.CurrAttr.Value = "" MyForm.CurrSize.Value = "" MyForm.Packets.Value = "" MyForm.Bogus.Value = "" MyForm.PackDrop.Value = "" MyForm.PackCorr.Value = "" MyForm.PackDup.Value = "" MyForm.SrcPath.Value = "" MyForm.DestPath.Value = "" MyForm.EndAddr.Value = "" MyForm.EndPort.Value = "" MyForm.SrcAddr.Value = "" MyForm.SrcPort.Value = "" MyForm.LocAddr.Value = "" MyForm.LocPort.Value = "" MyForm.LastPort.Value = "" '--- Determine routing. If MyForm.IPAddr.Value = "" Then MyForm.Routing.Value = " Listen for Unicast" MyIPAddr = "" nsfile1.Type = 2 Else MyIPAddr = MyForm.IPAddr.Value MyForm.Routing.Value = "Listen for Multicast" End If '--- Set up callbacks. call nsfile1.FtsRegisterStatusCallback(4096, 5, 8192, 8192, 1, 1, 1, 1, 1, 4+8+16+32, 0) '--- Start transfer. call nsfile1.FtsStartFileTransferReceive(MyIPAddr, MyForm.IPPort.Value, MyForm.Filter.Value,MyForm.FilePath.Value, MyForm.Attributes.Value, MyForm.Flags.Value) If Err.Number Then MsgBox "Start Error = " & ReturnError(Err.Number) End Sub
Sub BtnCancelFile_OnClick On Error Resume Next call nsfile1.FtsCancelFileTransferReceive MsgBox "Transfer Cancelled. Error = " & ReturnError(nsfile1.Result) End Sub
Sub nsfile1_FtsOnTransferStarted On Error Resume Next MyForm.StartTime.Value = Time() MyForm.SrcPath.Value = nsfile1.SourceFilePath MyForm.DestPath.Value = nsfile1.DestinationFilePath MyForm.EndAddr.Value = nsfile1.EndpointAddress MyForm.EndPort.Value = nsfile1.EndpointPort MyForm.SrcAddr.Value = nsfile1.SourceAddress MyForm.SrcPort.Value = nsfile1.SourcePort MyForm.LocAddr.Value = nsfile1.LocalAddress MyForm.LocPort.Value = nsfile1.LocalPort MyForm.LastPort.Value = nsfile1.LocalPortUsed End Sub
Sub nsfile1_FtsOnFileTransferStarted On Error Resume Next MyForm.CurrFile.Value = nsfile1.CurrentFilePath MyForm.CurrAttr.Value = nsfile1.CurrentFileAttributes MyForm.CurrSize.Value = nsfile1.CurrentFileSize End Sub
Sub nsfile1_FtsOnFileTransferCompleted On Error Resume Next MyForm.NumFiles.Value = nsfile1.NumFilesTransferred End Sub
Sub nsfile1_FtsOnTransferProgress On Error Resume Next MyForm.NumFiles.Value = nsfile1.NumFilesTransferred ProgBar = Int((nsfile1.PercentFileDataBytesTransferred)/5) If ProgBar < 20 Then MyForm.PerFileData.Value = String(ProgBar, "?) Else MyForm.PerFileData.Value = "File Transferred!" End If MyForm.TotalBytes.Value = nsfile1.NumTotalBytesTransferred MyForm.DataBytes.Value = nsfile1.NumTotalDataBytesTransferred MyForm.Packets.Value = nsfile1.NumPacketsTransferred MyForm.Bogus.Value = nsfile1.NumBogusPacketsReceived MyForm.PackDrop.Value = nsfile1.NumPacketsDropped MyForm.PackCorr.Value = nsfile1.NumPacketsCorrected MyForm.PackDup.Value = nsfile1.NumDuplicatePacketsReceived End Sub
Sub nsfile1_FtsOnTransferCompleted On Error Resume Next TTime = TimeValue(Now) - TimeValue(MyForm.StartTime.Value) MyForm.MyTime.Value = "Total = " & Hour(TTime) & " h " & Minute(TTime) & " m " & Second(TTime) & " s" MsgBox "Transfer Completed. Error = " & ReturnError(nsfile1.Result) '--- Bytes MyForm.NumFiles.Value = nsfile1.NumFilesTransferred MyForm.PerFileData.Value = "File Transferred!" MyForm.TotalBytes.Value = nsfile1.NumTotalBytesTransferred MyForm.DataBytes.Value = nsfile1.NumTotalDataBytesTransferred MyForm.CurrFile.Value = nsfile1.CurrentFilePath MyForm.CurrAttr.Value = nsfile1.CurrentFileAttributes MyForm.CurrSize.Value = nsfile1.CurrentFileSize '--- Packets MyForm.Packets.Value = nsfile1.NumPacketsTransferred MyForm.Bogus.Value = nsfile1.NumBogusPacketsReceived MyForm.PackDrop.Value = nsfile1.NumPacketsDropped MyForm.PackCorr.Value = nsfile1.NumPacketsCorrected MyForm.PackDup.Value = nsfile1.NumDuplicatePacketsReceived End Sub
Sub BtnAbout_OnClick call nsfile1.AboutBox() End Sub
Function ReturnError(ByVal ErrNum) Select Case ErrNum Case 0 ErrString = "No Error" Case 1 ErrString = "Already Requested" Case -2147467260 ErrString = "Cancelled" Case -2147467259 ErrString = "Failed" Case -2147287038 ErrString = "File Not Found" Case -2147024882 ErrString = "Out Of Memory" Case -2147024809 ErrString = "Invalid Parameter" Case -2147023436 ErrString = "Timed Out" Case Else ErrString = "Unknown Error " & CStr(Hex(ErrNum)) End Select ReturnError = ErrString End Function --> </SCRIPT>
</BODY> </HTML>
|