赵丽颖生宝宝时的视频:vb 6.0上传数据

来源:百度文库 编辑:高考问答 时间:2024/05/03 05:14:37
比如我现在C盘有一个文件,想让Vb程序将它上传到比如ftp://xx.xx.com/xx 这个目录中,如何做呢?谢谢

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