赵丽颖生宝宝时的视频:vb 6.0上传数据
来源:百度文库 编辑:高考问答 时间:2024/05/03 05:14:37
A协议
我们约定:请求上传的主机叫为A,作出响应的主机叫为B。现在A要上传文件给B:
(1) A主动去PING(发送类型为PING的包) B,若失败(超时),则报告“对方主机不在线”而退出;否则,转到(2)。
(2) A主动发送写请求给B,若失败(超时),则报告错误而退出;否则记下目的文件当前大小,并转到(3)。
(3) A打开源文件(且定位到要开始传送的位置)并载入数据到缓存中。
(4) 从缓存中循环发送窗口大小个的数据包;若收到OVER(指的是REC_ALL 或 ABORT),则立即退出;若超过循环次数,则报告超时错误而退出。
(5) 收到ACK 块号时,设置块号(若块号为0,则载入数据到缓存)并重置循环次数。
(6) 收到ABORT 或 REC_ALL,则退出。
相关说明:
(1) 每次从源文件中载入数据都要记下载入长度,以便控制文件结尾的数据包大小。
(2) ACK 中块号标志“需要收到的包”。
(3) 由于协议(5)不断修改块号和重置循环次数,从而协议(4)的窗口不断移动。
(4) 到了缓存末端,可能循环发送小于窗口大小个的数据包。
(5) 写请求包中含有文件名,文件大小,数据内容大小。
B协议
(1) 若收到PING,则立即发送PING_OK。
(2) 若收到WRITE,则记下文件标号.文件名.文件大小.数据内容大小,并做好接收数据准备(打开或新建文件),并发送WRITE_OK 。
(3) 若收到TRANSFER,则重置计数器,检查长度是否正确,再检查是不是当前要的包,若是则写入文件中且块号加一,接着检查文件数据是否接收完毕,若完毕则发送REC_ALL并退出,否则发送ACK 块号。
相关说明:
(1) WRITE_OK 中载有目的文件的当前大小,这样可以做到续传。
(2) 若计数器到时,则报告超时且发送ABORT而退出。
实现
以下给出部分协议实现代码:
(1)A端
打开和关闭流#region 打开和关闭流
private void Open()
{
if(MyStream==null)
{
if(File.Exists(this.FileName))
{
MyStream=new FileStream(this.FileName,FileMode.Open,FileAccess.Read,FileShare.Read);
MyStream.Seek(_Position,SeekOrigin.Begin);
}
else throw new Exception(this.FileName " 不存在!");
}
}
public void Close()
{
if(MyStream!=null)
{
MyStream.Close();
MyStream=null;
}
}
#endregion
public void HandleWRITE_OK(UFTP_Packet packet)
{
if(!WRITE_OK)
{
this.WRITE_OK=true;
this._Position=Convert.ToInt64(System.Text.Encoding.Unicode.GetString(packet.MessageBuffer));
}
}
public void HandleACK(UFTP_Packet packet)
{
if(packet.AliceID==0