vc+++网络文件传输

vc+++网络文件传输
vc+++网络文件传输

掌握实现网络文件传输的方法,并了解TCP连接是字符流的

1.使用CSocket实现单线程文件传输

2.应用多线程技术结合CAsyncSocket实现文件传输

3.加入异常控制语句,增强程序的鲁棒性(Robust)

4.了解如何提高套接字传输的速率及如何加强传输的稳定性

·单线程文件传输:

在第一章中曾经讲过用windows socket传输数据的方法,本章的单线程文件传输实验要在这个基础上融入文件操作,以实现基本的文件传输。

·多线程文件传输:

在文件传输程序中,一个线程是一个搬运工,负责把文件数据从网络(看作是一条走廊)的一个端点搬到另一个端点;使用多线程,就相当于请了多个搬运工来做这项工作,效率自然会提高。但是有一个疑问:“既然多个工人一起搬会提高工作进度,那是不是人越多越好呢?”——当然不是。因为既然把网络看成一条走廊,那么当走廊中拥满了人的时候,这些人就成了搬运工作的瓶颈。所以选择一个适当的线程数,对多线程传输的性能(传输速率)会有重要的影响(这一问题还会在后面探讨)。

由于多线程文件传输的实现涉及线程的同步的问题,所以实现和调试起来都有一定的困难。但应当相信这是一项有趣的工作,因为多线程技术能把局域网传输的潜力充分的挖掘出来!

建议读者再看实验步骤之前,先阅读一下文章末尾的【注意事项】一节。这将有助于更好的理解本章的实现。

一.单线程文件传输(I):

·服务器端(负责发送数据)的实现

1.建立一个基于对话框的工程Server,并在建立的过程中选择支持windows socket。

2.在对话框上添加“发送”按钮。

3.为“发送”按钮添加事件BN_CLICKED的响应函数OnSend()。

void CServerDlg::OnSend()

{

// TODO: Add your control notification handler code here

CFileDialog fd(TRUE); // CFileDialog是MFC提供的一个用于选择文件的对话框类

CString filename;

char fn[40];

CSocket listenSocket, socketSend;

CFile file;

long FileLength;

char* data;

if(IDOK==fd.DoModal()) // 启动用于选择文件的对话框

{

//选择了文件

filename=fd.GetFileName(); // 获取用户选择的文件的文件名

if(!file.Open(filename.GetBuffer(0),CFile::modeRead| File::typeBinary))

{

AfxMessageBox(" 打开文件错误,取消发送!");

return;

}

strcpy(fn,filename.GetBuffer(0));

}

else return; //按了取消按钮

listenSocket.Create(7000,SOCK_STREAM);

listenSocket.Listen(5);

listenSocket.Accept(socketSend);

FileLength = file.GetLength(); // 获取文件的长度

socketSend.Send(&FileLength, 4); // 把要发送的文件的长度传送给对方

socketSend.Send(fn,40); // 发送要传送的文件的文件名

data = new char[FileLength]; //分配一块和要传输的文件一样大小的内存空间

file.ReadHuge(data, FileLength); //把文件中所有的数据一次性读入data

socketSend.Send(data, FileLength); //把data中的数据都发送出去

file.Close();

delete data;

socketSend.Close();

}

·客户端(负责接收数据)的实现

1.建立一个基于对话框的工

程,并在建立的过程中选

择支持windows socket。

(为了能够利用Server端的

代码,在程序编写时,可

以复制Server的代码到

Client目录,并在Server

的基础上修改或添加代

码)

2.在对话框上添加“接收”按钮。

3.为“发送”按钮添加事件BN_CLICKED的响应函数OnReceive ()。

void CServerDlg::OnReceive()

{

// TODO: Add your control notification handler code here

CSocket socketReceive;

CFile file;

long FileLength;

char * data;

char fn[40];

socketReceive.Create();

socketReceive.Connect("127.0.0.1", 7000); //这里为了测试的方便,我们使用127.0.0.1本地回路IP

socketReceive.Receive(&FileLength, 4); //获取要接受的文件的长度

socketReceive.Receive(fn, 40); //获取要接受的文件的文件名

data = new char[FileLength];

socketReceive.Receive(data, FileLength); //获取要接受的文件内容

file.Open(fn,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary); //在当前目录建立文件

file.WriteHuge(data, FileLength);

file.Close();

delete data;

socketReceive.Close();

AfxMessageBox("接收文件成功");

}

上面的程序以最简单的方式实现了文件传输功能。但正是因为它的简单,所以忽略了很多重要的东西。读者读到这里的时候可以考虑一下可能存在着些什么问题。在这里给出一些上面程序的不足:

1.在本书的原理部分曾经提到阻塞式和非阻塞式两种套接字的工作方式。在上面的程序中使用的CSocket类提供了阻塞式的服务,这令编写程序非常方便。然

而这却不利于程序的友好性和可用性——服务器端在没有获得客户端连接的

时候固执的侦听,一点也不理会用户的命令。对话框不再响应消息,用户只能

用强制关闭来结束程序。

2.希望一次性地动态分配整个文件大小的堆存贮区作为读入数据的内存空间。这个空间一方面受到堆大小的限制,另一方面也受到CFile类成员函数ReadHuge()

和WriteHuge()的读写能力限制,还有Receive()和Send()函数一次能够发送的

数据也以其参数的最大值为限,所以在遇到大中型文件的时候,系统将不能满

足程序提出的动态分配大块内存的要求,这样传输便不得不终止。

3.在实际的网络传输中,网络情况是十分多变和复杂的。通过CSocket的成员函数们的返回值可以了解传输的状态,然而在上面的程序中却没有使用这些异常

控制,带来的直接后果就是当遇到网络拥塞或对方传送的数据暂时未到时,程

序就会认为传输结束而出乎意料的终止。

4.在上面的程序中,程序没有传送文件的属性数据,而只通过套接字传送文件数据。在实际应用中这种假设通常是不存在的,所以应当把文件属性也传给对方,

以达到文件的完全复制。

改进方法:

1.使用CAsyncSocket实现异步套接字,避免阻塞

2.化整为零,把文件分若干次读入并发送

3.在程序中加入异常控制语句已应付网络多变的情况

4.在传送文件数据之前获取文件属性值传给对方

下面将给出基于上述改进方案的前三点而重新编写的程序,对于第四点,有兴趣的读者可以自己实现。

二.单线程文件传输(II):

·服务器端(负责发送数据)的实现

1.建立一个基于对话框的工程

Server,并在建立的过程中选择支

持windows socket。

2.在对话框上添加“侦听”,“发送”

按钮。

3.用Class Wizard添加一个派生于

CAsyncSocket的类CMySocket。

4.添加CMySocket类的全局变量

listenSocket用于侦听。

添加CMySocket类全局变量的位

置,最宜在MySocket.cpp的头部。

如下:

// MySocket.cpp : implementation file

//

#include "stdafx.h"

#include "Server.h"

#include "MySocket.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CMySocket

CMySocket listenSocket;

CMySocket::CMySocket()

{

}

CMySocket::~CMySocket()

{

}

本章中以后所有的CMySocket型全局变量都应仿效本段程序添加。

5.添加CMySocket类的全局变量sendSocket,用于传输数据

6.为“发送”按钮添加事件BN_CLICKED的响应函数OnSend() #define ReadSize 500

void CServerDlg ::OnSend()

{

// TODO: Add your control notification handler code here

CFile file;

char data[ReadSize]; // 用于存放读入的文件数据块

long ByteSended=0, FileLength,count;

CFileDialog fd(TRUE);

CString filename;

char fn[40];

if(IDOK==fd.DoModal()) // 启动用于选择文件的对话框

{

//选择了文件

filename=fd.GetFileName(); //获取选择的文件的文件名

if(!file.Open(filename.GetBuffer(0),CFile::modeRead|CFile::typeBi

nary))

{

AfxMessageBox("打开文件错误,取消发送!");

return;

}

strcpy(fn,filename.GetBuffer(0));

}

else return; //按了取消按钮

FileLength=file.GetLength();

sendSocket.Send(&FileLength,sizeof(long));

sendSocket.Send(fn,40);

memset(data,0,sizeof(data));

do{

// 从文件读取数据,每次最多读入ReadSize个字节。count 表示实际读入的字节数

count=file.ReadHuge(data, ReadSize);

// 发送数据

while(SOCKET_ERROR==sendSocket.Send(data,count))

{

}

// 统计已发送的字节数

ByteSended =ByteSended+count;

}while(ByteSended

file.Close();

}

7.为“侦听”按钮添加事件BN_CLICKED的响应函数OnListen () void CServerDlg::Listen()

{

// TODO: Add your control notification handler code here

listenSocket.Create(7000);

listenSocket.Listen();

}

8.为CMySocket类添加消息OnAccpet响应函数OnAccept()

void CMySocket::OnAccept(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

if(!listenSocket.Accept(sendSocket))

{

AfxMessageBox("连接失败");

return;

}

AfxMessageBox("连接成功");

CAsyncSocket::OnAccept(nErrorCode);

}

·客户端(负责接收数据)的实现

1.建立一个基于对话框的工程,并在建立的过程中选择支持windows socket。

2.添加CMySocket类的全局变量receiveSocket,用于接收数据

3.在对话框上添加“连接”和“接收”按钮。

4.为“接收”按钮添加事件BN_CLICKED的响应函数OnReceive() #define ReadSize 500

void CServerDlg::OnReceive()

{

// TODO: Add your control notification handler code here

CFile file;

char data[ReadSize];

long FileLength;

long WriteOnce;

long WriteCount = 0;

char fn[40];

// 接收文件长度

while(SOCKET_ERROR ==receiveSocket. Receive(&FileLength, sizeof(long)))

{

}

// 接收文件名

while(SOCKET_ERROR ==receiveSocket. Receive(fn, 40))

{

}

if(!file.Open(fn,CFile::modeCreate|CFile::modeWrite))

{

AfxMessageBox("Create file error!");

return;

}

do{

WriteOnce =receiveSocket.Receive(data,ReadSize);

if(WriteOnce ==SOCKET_ERROR)

continue;

// 统计已接受的字节数

WriteCount=WriteCount+WriteOnce;

// 把收到的数据写入文件

file.WriteHuge(data,WriteOnce);

}while(WriteCount< FileLength);

file.Close();

AfxMessageBox("接收文件成功");

}

5.为“连接”按钮添加事件BN_CLICKED的响应函数OnConnecting()

void CServerDlg::OnConnecting()

{

// TODO: Add your control notification handler code here

receiveSocket.Create();

receiveSocket.Connect("127.0.0.1",7000);

}

看过了上面的程序后,是不是有个疑问——为什么在发送端发送了固定数量的数据(ReadSize个字符),而在接受方WriteOnce =receiveSocket.Receive(data,ReadSize);语句后的已接收字符统计时并没有直接加ReadSize,而是加上了Receive()函数的返回值WriteOnce?请看下面的一个小实验:发送方一次发送10000字节的数据,而在接受方用下面的代码接受数据:

CString str;

int received=0, total=0;

char data[10000];

while(total<10000)

{

while(SOCKET_ERROR==(received= receiveSocket.Receive(data,10000)))

{

}

str.Format(“received=%d”,received);

total=total+received;

AfxMessageBox(str);

}

str.Format(“total=%d”,total);

AfxMessageBox(str);

每次运行实验程序后,变量total的值是不变的,它在两重循环都结束后总保持值为10000。但每次实验弹出的对话框显示的received的值总是变化的。一种可能的情况是,三次弹出显示received值的对话框,每次的显示依次为received =1987 , received= 4012 , received= 4001。这说明我们的SOCK_STREAM型的套接字总能保证数据的完整传输,但它并不能保证数据一次性的到达。

实际上,在网络参考模型的结构中socket处于传输层。在传输层发送的数据需要经过底下多个层次的分解和打包,最后才达到的物理层(过程中的分段和打包的操作对于程序员是不可见的)。socket连接基于TCP协议,而TCP连接是字节流而非报文流(报文的边界并不按头尾衔接的方式保存)。例如,如果发送进程将4块512字节的数据写到TCP流上,那么这些数据可能按4个512字节的顺序或2个1024的顺序或者1个2048字节的数据块,或者是其他一些方式传送到接收进程的。接收方无法测出这些数据是以哪种单位写入的。

用Windows socket创建的每个套接字都有一块属于自己的缓冲区(Windows下默认的socket发送和接收缓冲区大小均是4096字节,要想改变或获取它的大小可使用函数setsockopt(…)和getsockopt(…)<详见MSDN>)。控制socket缓冲区的大小可以优化网络程序的传输性能,但同时也为我们带来了一个问题:当一个应用程序把数据送给

TCP实体时,TCP根据自己的判断,可能会立刻将其发送出去或将其缓存起来(为了收集较大量的数据,然后发送)。然而,有时候应用程序很想将数据立即发送出去。例如,假设一个用户登录到了远端的机器上,他输入一条命令并按下回车键之后,该命令行应该立刻送往远端机器而不是暂存起来直到用户输入了下一条命令后再发送。为了强制立即发送数据,应用程序可以使用PUSH标志,通知TCP不能耽搁数据的发送。一些早期的应用程序使用PUSH标志作为一种记号来区分出报文的边界。这种方法有时可以奏效,但有时也会失败,因为并非所有的TCP实现都将PUSH标志传送到接收方的应用程序。

而且,如果在每个PUSH标志发送前又有PUSH标志输入进来(例如由于输出线路很忙),那么TCP将会随意地将所有带PUSH标志的数据聚集成一个IP数据报。在这些各种各样的数据片之间不再加以区分(其实,UNIX系统中的文件也有这种特性。读取文件时无法分清文件是一次写一个块、一个字节还是一次全部写入。如同对待UNIX文件一样,TCP软件不知道字节表示什么,并且不无疑去弄清楚,字节就是字节。)①为了解决这个问题,有时不得不编写程序,统计收到的字符数,然后,根据再已知的数据段的长度来区分每个数据段。

下面,让来看一看如何在客户端区分已知长度的数据段。(假设已知数据段的长度是2,并且以‘#’作为数据发送结束的标志)

服务器端:

char data[100]={"0123456789#"};

CSocket socketListen, socketSend;

socketListen.Create(7000);

socketListen.Listen();

socketListen.Accept(socketSend);

socketSend.Send(data,strlen(data)); // 服务器端一次把所有的数据发送出去

socketListen.Close();

socketSend.Close();

客户端:

char buffer[1]; // 用以储存每次收到的一个字符

char temp[100]; // 用以储存正在合并中的一个数据段

int i=0;

CSocket socketReceive;

socketReceive.Create();

socketReceive.Connect("127.0.0.1",7000);

memset(temp,0,sizeof(temp));

do{

while(SOCKET_ERROR==socketReceive.Receive(buffer,1)); // 一次接收一个字符

①Andrew S.Tanenbaum 著《计算机网络》(第三版)P403

temp[i++]=buffer[0]; // 把接收到的字符加入正在形成的数据段的尾部

if(i==2) // 如果收到的字符数等于已知数据段的长

{

CString str;

str.Format("收到两个字节%s",temp);

AfxMessageBox(str); // 显示这个数据段

memset(temp,0,sizeof(temp)); // 清空这个数据段,为接收下一个数据段作准备

i=0;

}

}while(buffer[0]!='#'); // 判断接收到的是否是结束标志

socketReceive.Close();

三.多线程文件传输

如果仔细地统计单线程传输文件的速度,便会发现即使在像湖南大学这种高速的校园网内,传输的速率也不会超过400KB/S。然而,在用下载工具(比如:netants,flashfxp 等)下载资料时,时常可以看到大于600KB/S的速度。疑问由此产生——难道这些软件采用了“五鬼搬运术”?其实,当探究过其中的原理之后,便会惊奇的发现原来这些软件真的使用了具有神话色彩的“五鬼搬运术”,而驱使这些“鬼”来搬运数据的正是多线程技术!

多线程技术在网络程序设计方面有着很大的作用,它不仅能提高程序的发送能力,而且极大地方便了程序员设计编写文件服务器程序(同时处理多个连接)。但是,多线程程序设计有一个很大的问题就是要涉及到线程的同步操作,这确实是一件令人头痛的事情,但为了实现高性能的传输程序,也不得不把它弄个清楚(后文将介绍一些线程技术,至少在文件传输方面会涉及到的一些知识)。

在MFC中,启动线程有多种方法:AfxBeginThread(…),CreateThread(…),还有就是process.h中定义的_beginthread()。传输文件时,不仅应使用多个线程传输文件数据,另外,最好启动一个线程监视文件传输的状态(传输进度等),以便作一些必要的操作,比如:接收方在接收完成时,合并每个线程接收的数据文件;又如:即时显示传输进度

或计算传输速率。

操作系统课程讲述了线程PV同步原语,锁和条件变量。在MFC中,用CEvent 等类来控制线程同步。CEvent和条件变量比较像,它的成员函数SetEvent()用来把这个事件对象设置为有信号的,ResetEvent()函数用来把这个事件对象设置为无信号的,可配套使用的函数WaitForSingleObject用来挂起线程直到事件对象从无信号的变为有信号的。向线程传递数据可以通过下面多种方式实现,以下的两种方式相对简便:1. 以函数值参数方式,在创建线程时传入;这种方式十分可靠,因为每个函数值参数(都会在函数体内保存一个副本,不会受其他线程修改变量的影响),但是只能在创建线程的时候传入,缺乏灵活性;2. 使用全局变量。使用全局变量要用CMutex类的锁机制保护好,否则会导致线程读入数据的错误。下面的多线程程序将使用第一种方式为每个线程“工人”分配工作编号(idx)。

在发送端程序中,多个线程同时读一个欲发送的文件。特别需要注意的是,如果不在打开文件时作一些特别的设置,虽然第一个程序可以正常的打开文件,但之后的程序将因为第一个程序对文件的“排他读”行为而打开文件失败。因此所有的线程打开文件时都应该设置共享读写属性CFile::shareDenyNone。设置方法如下:

CFile file;

File.Open(“abc.txt”,CFile::modeRead|CFile::shareDenyNone);

上文曾把线程比作工人,它们把数据从一台计算机搬到另一台计算机。为了使它们能完成这项任务,必须教会它们同样的搬运技术,也就是说,需要为它们编写几乎相同的工作代码。然而,毕竟程序中的每个线程要负责一个文件中不同的数据段,所以它们还是有一些小小的区别,比如:它们必须知道各自负责搬动的物品放在哪里(源文件的哪一段)和搬到哪里去(存放在接受方的什么文件中)。另外,要管理好这些工人并为它们分配工作也是一件重要的任务,所以派一个工头(也是一个线程)来完成这项任务是必不可少的不同的,但与现实不同的是,下面程序中的每个工头手下只有一个工人。

使用n个线程传输文件时,应当把文件分为大小类似的n块,每个线程负责其中的一块。在客户端,让每个接收线程(工人)把它们收到的数据保存为一个独立的文件,当所有的线程都工作结束时,再把这些文件合并起来。

·服务器端(负责发送数据)的实现

1.一个基于对话框的工程Server,并在建立的过程中选择支持windows socket。

2.在对话框上添加“侦听”和“发送”按钮。

3.用ClassWizard添加一个派生于CAsyncSocket的类CMySocket

4.定义CMySocket型的全局变量listenSocket和数组sendSockets[5] //listenSocket 用于侦听,sendSockets中的5个套接字分别被五个线程用来收发数据下面的程序总共启动5个线程用来传输文件数据。每个线程根据自己的编号idx使用套接字数组sendSocket[5]中相应的套接字传送数据。注意,在Create这个套接字数组的时候,完全可以让它们共享一个端口号。使用CAsyncSocket类时,我们无需做更多的设置就可以使用这项技术。

5.双击“侦听”按钮,为它添加事件BN_CLICKED的响应函数OnListen()

void CServerDlg ::OnListen()

{

// TODO: Add your control notification handler code here

listenSocket.Create(7000);

listenSocket.Listen();

}

6.为CMySocket类添加消息OnAccpect的响应函数OnAccept()

void CMySocket::OnAccept(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

static int File_Socket_Accepted=0;

if(!listenSocket.Accept(sendSockets[File_Socket_Accepted])) // 接收对方套接字的连接

{

AfxMessageBox("接收连接失败!");

return;

}

sendSockets[File_Socket_Accepted].AsyncSelect(FD_READ|FD_WRITE|FD_CL OSE);

File_Socket_Accepted++; // 已接收的连接数加一

if(File_Socket_Accepted==5) // 如果所有的连接已经都接受了

{

AfxMessageBox("连接成功");

listenSocket.Close();

}

CAsyncSocket::OnAccept(nErrorCode);

}

7.编写为线程分配要传输的数据块的全局函数GetBeginPos()

//获取线程负责的文件数据块起始位置及大小,TotalThreads为启动传输线程的总数,ThreadIndex为线程的编号,BgPos为计算得到的数据块相对于文件头的偏移量,BlkSize为数据块的大小

void GetBeginPos(int TotalThreads,int ThreadIndex/*from 1*/,long file_length, long &BgPos, long &BlkSize)

{

long BlockSize, lastBlockSize, BeginPos;

int i;

BlockSize=file_length/TotalThreads;

lastBlockSize=file_length;

BeginPos=0;

for(i=1;i<=ThreadIndex-1;i++)

{

lastBlockSize=lastBlockSize-BlockSize;

BeginPos=BeginPos+BlockSize;

}

if (ThreadIndex==TotalThreads)

{

BgPos=BeginPos;

BlkSize=lastBlockSize;

}

else

{

BgPos=BeginPos;

BlkSize=BlockSize;

}

}

8.添加全局变量CString filename; 和char fn[40];用以储存被发送的文件的文件名

把它们添加到ServerDlg.cpp文件的头部。如下:

// ServerDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Server.h"

#include "ServerDlg.h"

#include "MySocket.h"

#include "process.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

CString filename;

char fn[40];

9.双击“发送”按钮,为它添加事件BN_CLICKED的响应函数OnSend() 注意:必须在使用_beingthread()和_endthread()函数的.cpp文件的头部加上#include “process.h”

void CServerDlg ::OnSend ()

{

CFileDialog fd(TRUE);

if(IDOK==fd.DoModal()) // 启动用于选择文件的对话框

{

//选择了文件

filename=fd.GetFileName(); //获取选择的文件的文件名

strcpy(fn,filename.GetBuffer(0));

}

else return; //按了取消按钮

for(int i=0;i<5;i++)

_beginthread(SendThreadFunction,0,(void *)i); //启动工头线程(由工头线程启动工人线程)

}

用传递函数参数的方式为每个线程指定序号,是因为这样可以简化程序,避免加入代码处理因使用全局变量而带来的线程同步问题。这些代码的作用是,驱动工头们到它们的岗位上(每个工头管理一个工人——数据传送线程)。

10.编写SendThreadFunction函数

这个函数起到了工头的作用,通过参数(void*)i为每个工人线程编号和分配任务。

void SendThreadFunction(void * pParam)

{

int idx=(int)pParam;

SendThread(idx+1); // 启动工人线程

_endthread();

}

11.编写真正实现数据发送的函数SendThread

#define ReadSize 500

void SendThread(int idx) // 传输文件数据的函数(搬运工人)

{

CFile file;

char data[ReadSize];

long BeginPos, Size;

long FileLength;

long ReadOnce, LeftToRead, count;

if(!file.Open(fn,CFile::modeRead|CFile::shareDenyNone))

{

AfxMessageBox("read file error!");

return;

}

FileLength=file.GetLength();

sendSockets[idx-1]. Send(&FileLength, 4);

sendSockets[idx-1]. Send(fn, 40);

// 获取本线程传输任务(传送块的大小和起始位置)

GetBeginPos(5 , idx, FileLength ,BeginPos, Size); //其中的5表示总共有5个线程,idx表示本线程编号

file.Seek(BeginPos, CFile::begin); //每个线程函数找到自己任务的起始点

LeftToRead=Size;

while(LeftToRead>0)

{

ReadOnce=(LeftToRead>ReadSize)?ReadSize:LeftToRead;

count=file.ReadHuge(data,ReadOnce);

while((SOCKET_ERROR== sendSockets[idx-1].Send(data,count)))

{

}

LeftToRead=LeftToRead-count;

}

file.Close();

}

·客户端(负责接收数据)的实现

1.一个基于对话框的工程,并在建立的过程中选择支持windows socket。2.在对话框上添加“连接”按钮和“接收”按钮。

3.用ClassWizard添加一个派生于CAsyncSocket的类CMySocket

4.定义全局句柄数组HANDLE hEvent[5];

5.定义CMySocket型的全局变量listenSocket和数组receiveSockets[5] 6.定义全局变量char fn[40];用以储存接收文件的文件名

7.为CMySocket类添加消息OnConnect的响应函数OnConnect() void CMySocket::OnConnect(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

static int File_Socket_Connected=0;

if(nErrorCode==0)

{

File_Socket_Connected++;

this->AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE);

if(File_Socket_Connected==5)

{

File_Socket_Connected=0;

AfxMessageBox("连接成功");

}

}

CAsyncSocket::OnConnect(nErrorCode);

}

8.为“连接”按钮添加事件BN_CLICKED的响应函数OnConnect()

void CServerDlg::OnConnect()

{

for(int i=0;i<5;i++)

{

receiveSockets[i].Create();

receiveSockets[i].Connect(“127.0.0.1”,7000);

}

}

9.为“接收”按钮添加事件BN_CLICKED的响应函数OnReceive()

void CServerDlg::OnReceive ()

{

//以下for循环的作用是初始化事件对象为无信号的,用于监视线程识别文件传输是否结束

for(int i=0;i<5;i++)

{

if((hEvent[i]=CreateEvent(NULL,false,false,NULL))==NULL)

AfxMessageBox("Create hE-Event Handle Failed");

ResetEvent(hEvent[i]);

}

_beginthread(ReceiveNotifyFunction,0,NULL);

for(i=0;i<5;i++)

_beginthread(ReceiveThreadFunction,0,(void *)i);

}

10.编写ReceiveThreadFunction函数

void ReceiveThreadFunction(void * pParam)

{

int idx=(int)pParam;

ReceiveThread(idx+1);

_endthread();

}

11.编写真正实现数据发送的函数ReceiveThread

#define ReadSize 500

void ReceiveThread (int idx) // 接收文件数据的函数(搬运工人)

{

CFile file;

char data[ReadSize];

long BeginPos, Size;

long FileLength;

long WriteOnce;

char filename[200];

sprintf(filename,"tmpsave-%d.dat",idx);

if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite))

{

AfxMessageBox("write file error!");

return;

}

while(SOCKET_ERROR==receiveSockets[idx-1]. Receive(&FileLength, 4))

{

}

while(SOCKET_ERROR==receiveSockets[idx-1]. Receive(fn, 40))

{

}

// 获取本线程传输任务(传送块的大小和起始位置)

GetBeginPos(5 , idx, FileLength ,BeginPos, Size); //其中的5表示总共有5个线程,idx表示本线程编号

while(Size>0)

{

if(SOCKET_ERROR==(WriteOnce=

receiveSockets[idx-1].Receive(data,ReadSize)))

continue;

Size=Size-WriteOnce;

file.WriteHuge(data,WriteOnce);

}

file.Close();

SetEvent(hEvent[idx-1]); // 发信号通知监视线程本线程任务完成}

12.编写监视文件接收是否结束的函数ReceiveNotifyFunction

void ReceiveNotifyFunction(void * pParam) // 监视文件传输的状态的线程

{

WaitForMultipleObjects(5,hEvent,true,INFINITE);//当所有工人线程都报告自己完成任务后,准备合并文件

CombineFiles(); // 拼接每个线程暂存数据的文件

_endthread();

}

13.编写合并文件的函数CombineFiles

void CombineFiles()

{

CFile fileDest, fileSour;

char sourname[500];

static char data[10000];

long count;

int i;

if(!fileDest.Open(fn,CFile::modeCreate|CFile::modeWrite)) // 建立并打开目标文件

{

AfxMessageBox("Combine: Make Dest File Error");

return;

}

for(i=0;i<5;i++) // 一次打开一个线程暂存的临时文件,把其中数据写入目标文件后,删除临时文件

{

wsprintf(sourname,"tmpsave-%d.dat",i+1);

if(!fileSour.Open(sourname,CFile::modeRead))

{

AfxMessageBox("Combine: Open Part File Error");

return;

}

count=fileSour.ReadHuge(data,10000);

while(count>0)

{

fileDest.WriteHuge(data,count);

count=fileSour.ReadHuge(data,10000);

}

fileSour.Close();

if(!DeleteFile(sourname))

{

AfxMessageBox("Combine: File-Delete Error");

return;

}

}

fileDest.Close();

}

上述的多线程传输程序的传输速度已经相当不错了,但是在系统中运行了这个程序后,操作系统对其他程序的响应明显慢了许多。下面我们通过对比CAsyncSocket类网络通信的两种方式来分析发生这种现象的原因。

(1)在成员函数OnReceive()中调用Receive()

在OnReceive()中使用Receive()接收数据的方式的优点是充分的利用了CAsyncSocket提供的消息机制,保证每次接收都能正常收到数据。因为OnReceive 消息的到来意味着可以从端口接受有效数据,而且保证调用Receive()函数有正的返回值,也就是不可能为SOCKET_ERROR。但其缺点是把Receive()的使用限定在这个成员函数中,这样就缺乏了灵活性,不利于使用线程进行接收。

CMySocket::OnReceive()

{

……

Receive(buffer,100);

……

}

(2)在其他地方直接调用Receive()

在这种情况下,由于没有了消息机制的支持,就需要直接使用CMySocket类对象,调用它的公有的Receive()进行轮询(即不断的调用它,并以它的返回值来判断接收情况)。当没有数据可以接收时,Receive()返回SOCKET_ERROR,用GetLastError()可以发现错误类型是WSAEWOULDBLOCK(10035),这说明此时没有可供接收的数据,否则说明已收到数据。SOCKET_ERROR这种返回值并不一定说明传输错误并且非要中断不可,它通常意味着“本套接字暂时无数据可接收”。

使用这种方法的优点是有利于在线程中进行收发操作,但是进行大量轮询而不利用消息机制会大量耗费CPU的时间。这种情况相当于一个人为了等一封信,而经常出门检查信箱,这无疑是非常累人的事(其实,他可以跟邮递员说好:“每次有信到的时候,敲门通知我”。对这个人来说这种方法的效率毫无疑问的高出了许多!)。如此,倘若使用的线程数一多,必然导致系统的速度骤然下降。典型的反映就是对于鼠标消息的响应迟钝。

CMySocket socket;

void fun()

{

while(SOCKET_ERROR==socket.Receive(buffer,100))

{

}

}

因为将使用多线程传输文件,而线程函数的定义有规定的语法void __cdecl ThreadFunction(void *pParam),也就是说不能使用CAsyncSocket::OnReceive()作线程函数体,所以下面的程序必然的选择了上述第二种表示方式。问题是:能否引入CAsyncSocket提供的Receive和Send消息,从而融合(2)的灵活性和(1)高效性呢?——答案是肯定的。

创建一个全局的事件句柄,并初始化为无信号的(nonsignal)。然后,在OnReceive()中加入SetEvent(hEvent),用WaitForSingleObject函数等待hEvent变为有信号的(即有Send或Receive消息到来)。这样,稍微改动代码,就可以大大下降接收端的CPU时耗。(注:调用WaitForSingleObject函数等待后,若事件对象没有变为有信号的,那么线程将暂时不使用CPU)。

客户端的代码的改变在下面用黑体标出,服务器端的情况类似,在这里不再赘述。

#define ReadSize 500

void ReceiveThread(int idx) // 传输文件数据的函数

{

……

while(Size>0)

{

WaitForSingleObject(hMessageCome[idx-1],2000); // 等待Receive消息

if(SOCKET_ERROR==(WriteOnce=

receiveSocket[idx-1].Receive(data,ReadSize)))

continue;

Size=Size-WriteOnce;

file.WriteHuge(data,WriteOnce);

}

……

}

为了实现的快捷,对于客户端工程,其实是把已建立的服务器端工程的副本作为基础,在其上删除或添加按钮和代码。读者在自行实现的时候可以考虑如何把服务器端和客户端融为一体(即实现双向的数据收发)。

另外,加入全局变量的最佳位置是定义这个变量的类的.cpp文件的头部。而且如果要在其他源文件中使用这个变量,应当用extern声明。否则,将无法访问这一变量。

比如,我希望在ServerDlg.cpp中使用在MySocket.cpp中定义的变量listenSocket,那么我必须在ServerDlg.cpp文件的头部,加入

// ServerDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Server.h"

#include "ServerDlg.h"

#include "MySocket.h"

#include "process.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

char fn[40];

extern CMySocket listenSocket;

使用第一个单线程传输程序的的步骤是:1.启动服务器端程序,按下“发送”按钮,选择好要传送的文件;2.启动客户端程序,按下“接收”按钮。随后双方便开始传输数据了。如果文件接收完毕,程序会弹出对话框显示“接收文件成功”。注意:单线程传输的第一个程序只适合传输小型文件。

使用后面两个例子程序的步骤是:先启动服务器端程序,按下“侦听”按钮,然后启动客户端程序,按下“连接”按钮。等到两端程序都弹出显示“连接成功”的对话框后,按下服务器端的“发送”按钮,选择要传送的文件,然后按下客户端的“接收”按钮。如果接收完成,程序会弹出对话框显示“接收文件成功”。注意:运行时必须先启

局域网文件传输及消息发送

《网络程序设计》课程设计报告书 题目:局域网文件传输与消息通信专业:网络工程 学号:20091423 学生姓名:史政法 指导教师:魏宁 完成日期:2012年06月06日

一、题目及要求 Window程序设计的基本要求: 1.熟练掌握网络的基本概念和原理; 2.熟练掌握网络编程接口Socket概念及编程原理; 3.掌握基于TCP/IP的Internet编程技术; 4.掌握各种软件开发工具的使用过程及方法。 本实例程序的技术要点是: ●如何从CasyncSocket类派生出自己的WinSock类。 ●理解WinSock类与应用程序框架的关系。 ●重点学习流式套接字对象的使用。 ●处理网络事件的方法。 二、系统概要设计 1、CSocket类的介绍 在MFC中,为了提供面向对象的编程方式而封装了两个WinSock类:一个是CAsyncSocket类,另一个是CSocket类。他们的不同点在于前者使用的是非阻塞模式操作,而后者可以支持阻塞模式的I/O操作。CSocket类是从CAsyncSocket类中继承来的,他为程序员提供了更高级的抽象性。由于CSocket类和CArchive类一起使用,并且管理了通讯的大多数操作,从而使程序员从网络编程的底层细节中解脱了出来,不必使用CAsyncSocket 的一些成员函数和一些Windows Socket API函数来处理通信问题。共同使用CSocket和CArchive类对象进行编程是最简单的WinSock编程模式。 下面是使用CSocket类进行网络通信的过程 (1)构造CSocket类对象 (2)用CSocket类对象的Create函数创建Windows Socket,Create()函数会调用Bind()函数将此函数绑定的指定的地址和端口。 (3)Socket创建完毕后,Listen()函数在服务器端进行监听客户的连接请求。 (4)在这一步,服务器端调用Accept()函数对客户端发来的请求进行接受和处理,而客户端则调用Connect()函数向服务器发出连接请求。 (5)在客户端和服务器端的数据传输完成后,应该分别在两边销毁创建的CSocket 对象。 2、编程思路和工程实现 用MFC AppWizard新建一个给予对话框的工程,在第三步中添加Windows SocketS的

文件传输系统的设计与实现.

JISHOU UNIVERSITY 专业课课程论文 文件传输系统的设计与实现题目: 作者: 学号: 所属学院:信息科学与工程学院 专业年级:计算机科学与技术 总评分: 完成时间:

文件传输系统的设计与实现 摘要 互联网的一大特点是实现信息共享,文件传输是信息共享的十分重要的内容之一。随之出现了许多FTP服务器来共享一些信息资源,编写一个操作简单,方便的FTP客户端来下载这些资源受到了人们的极大的欢迎。 FTP是一种用于在网上传输文件的协议,从原理上说,FTP是一个客户/服务器模式的应用协议。它用两个连接来实现:一个是控制连接,用来连接服务器和实现文件操作;一个是数据连接,用来实现数据传输。FTP的实现核心是命令/应答模式,FTP客户端将用户的所有FTP相关请求都转化为FTP服务器可识别的命令,然后发送到服务器,并接收和处理执行完毕后服务器传回的应答。 本程序是一个小型FTP服务器系统,实现了FTP服务器所应该具备的大多数功能,包括用户的登录,文件的上传、下载、删除,选择数据传输模式、目录选择等,并给出相应的提示。通过该程序的开发,基本上实现了一个FTP服务器所应该具有的功能,能够解释一般的FTP命令,并且符合RFC59规范。 本程序采用VC++6.0作为开发工具,设计步骤采用自顶向下的方法。 关键词:客户端;服务器;下载;上传;FTP

目录 第一章引言 (1) 1.1课题背景及意义 (1) 1.2课题研究现状 (1) 1.3研究内容 (2) 第二章FTP协议与原理 (3) 2.1 FTP简介 (3) 2.2 FTP的工作原理 (3) 2.3 FTP运行原理 (4) 2.4 FTP文件传输连接类型 (4) 第三章开发环境及工具介绍 (6) 3.1 C语言概述 (6) 3.2 VC++介绍 (6) 3.3 VC++6.0集成环境介绍 (6) 第四章FTP服务器需求分析 (8) 4.1 FTP文件传输的需求 (8) 4.2应解决的问题 (9) 4.3功能分析 (9) 第五章系统设计与实现 (10) 5.1功能要求 (10) 5.2开发工具 (10) 5.3主要功能与实现 (11) 5.4 菜单栏功能模块 (11) 5.5 查看功能模块 (13) 第六章系统测试 (18) 6.1系统可能出现的问题与不足 (18) 6.2 采用的测试类型 (18) 6.3 测试的过程与结果分析 (18) 总结 (20) 参考文献 (21)

文件传输工具项目概要

文件传输工具概要设计 1、引言 1.1编写目的 为了更好的开发本项目,特编写此文档 1.2背景 说明: a.系统的名称:文件传输工具 b.系统人员 开发提出: 开发人员:Hison 1.3定义 传输:传送 1.4参考资料 a.CSDN论坛; b.中国源代码网; c.Vb6.0开发教程。 2、总体设计 2.1需求规定 说明对本系统的主要的输入输出项目、处理的功能性能要求,详细的说明可参见附录C。 2.2运行环境 安装IE8以上版本的浏览器 2.3基本设计概念和处理流程

说明本系统的基本设计概念和处理流程,尽量使用图表的形式。 2.4功能器求与程序的关系 功能—方法IE事件拦截文件下载文件上传创建xml 输入验证 下载IE文件 上传文件 下载文件 2.6人工处理过程 说明在本软件系统的工作过程中不得不包含的人工处理过程(如果有的话)。 2.7尚未问决的问题 说明在概要设计过程中尚未解决而设计者认为在系统完成之前必须解决的各个问题。 3、接口设计 3.1用户接口 说明将向用户提供的命令和它们的语法结构,以及软件的回答信息。 3.2外部接口 说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与各支持软件 之间的接口关系。 3.3内部接口 说明本系统之内的各个系统元素之间的接口的安排。 4、运行设计 4.1运行模块组合 说明对系统施加不同的外界运行控制时所引起的各种不同的运行模块组合,说明每种运 行所历经的内部模块和支持软件。 4.2运行控制

说明每一种外界的运行控制的方式方法和操作步骤。 4.3运行时间 说明每种运行模块组合将占用各种资源的时间。 5、系统数据结构设计 5.1逻辑结构设计要点 给出本系统内所使用的每个数据结构的名称、标识符以及它们之中每个数据项、记录、文卷和系的标识、定义、长度及它们之间的层次的或表格的相互关系。 5.2物理结构设计要点 给出本系统内所使用的每个数据结构中的每个数据项的存储要求,访问方法、存取单位、存取的物理关系(索引、设备、存储区域)、设计考虑和保密条件。 5.3数据结构与程序的关系 说明各个数据结构与访问这些数据结构的形式: 6、系统出错处理设计 6.1出错信息 用一览表的方式说朗每种可能的出错或故障情况出现时,系统输出信息的形式、含意及处理方法。 6.2补救措施 说明故障出现后可能采取的变通措施,包括:

计算机网络技术学习心得体会.doc

计算机网络技术学习心得体会 21世纪是一个信息经济时代,信息尤为珍贵;信息即为财富,随着信息技术的高速发展并迅速渗透到社会生活的各个方面,计算机日益成为人们学习、工作、生活不可缺少的基本工具, 计算机逐渐的代替了传统的书本、去做为一个信息的载体。为了保护好信息的安全性,所以学好计算机网络技术尤为重要。 算机网络技术是通信技术与计算机技术相结合的产物。计算机网络是按照网络协议,将地球上分散的、独立的计算机相互连接的集合。连接介质可以是电缆、双绞线、光纤、微波、载波或通信卫星。计算机网络具有共享硬件、软件和数据资源的功能,具有对共享数据资源集中处理及管理和维护的能力。 计算机网络可按网络拓扑结构、网络涉辖范围和互联距离、网络数据传输和网络系统的拥有者、不同的服务对象等不同标准进行种类划分。一般按网络范围划分为:(1)局域网(LAN);(2)城域网(MAN);(3)广域网(W AN)。局域网的地理范围一般在10千米以内,属于一个部门或一组群体组建的小范围网,例如一个学校、一个单位或一个系统等。广域网涉辖范围大,一般从几十千米至几万千米,例如一个城市,一个国家或洲际网络,此时用于通信的传输装置和介质一般由电信部门提供,能实现较大范围的资源共享。城域网介于LAN和W AN之间,其范围通常覆盖一个城市或地区,距离从几十千米到上百千米。 计算机网络由一组结点和链络组成。网络中的结点有两类:转接

结点和访问结点。通信处理机、集中器和终端控制器等属于转接结点,它们在网络中转接和交换传送信息。主计算机和终端等是访问结点,它们是信息传送的源结点和目标结点。 计算机网络技术实现了资源共享。人们可以在办公室、家里或其他任何地方,访问查询网上的任何资源,极大地提高了工作效率,促进了办公自动化、工厂自动化、家庭自动化的发展。 学好计算机网络技术尤为重要,进入大学以来,我们开展了计算机网络技术课程,我们尽可能的利用好学习时间,尽可能地学习更多的知识和能力,学会创新求变,以适应社会的需要。 知识更新是很快的,只有不断地学习,才能掌握最新的知识。因此,在以后的学习工作中,我还要继续学习、操作,熟练运用这些知识,不断完善和充实自己,争取做一个合格的当代大学生,将来做一名对社会有用的人。 不管是现在还是将来,我觉得每个大学生都应不断地加强学习,不断地给自己充电,才能不断的开拓进取,勇于创新,才不至于被社会淘汰。

vc+++网络文件传输

掌握实现网络文件传输的方法,并了解TCP连接是字符流的 1.使用CSocket实现单线程文件传输 2.应用多线程技术结合CAsyncSocket实现文件传输 3.加入异常控制语句,增强程序的鲁棒性(Robust) 4.了解如何提高套接字传输的速率及如何加强传输的稳定性 ·单线程文件传输: 在第一章中曾经讲过用windows socket传输数据的方法,本章的单线程文件传输实验要在这个基础上融入文件操作,以实现基本的文件传输。 ·多线程文件传输: 在文件传输程序中,一个线程是一个搬运工,负责把文件数据从网络(看作是一条走廊)的一个端点搬到另一个端点;使用多线程,就相当于请了多个搬运工来做这项工作,效率自然会提高。但是有一个疑问:“既然多个工人一起搬会提高工作进度,那是不是人越多越好呢?”——当然不是。因为既然把网络看成一条走廊,那么当走廊中拥满了人的时候,这些人就成了搬运工作的瓶颈。所以选择一个适当的线程数,对多线程传输的性能(传输速率)会有重要的影响(这一问题还会在后面探讨)。 由于多线程文件传输的实现涉及线程的同步的问题,所以实现和调试起来都有一定的困难。但应当相信这是一项有趣的工作,因为多线程技术能把局域网传输的潜力充分的挖掘出来! 建议读者再看实验步骤之前,先阅读一下文章末尾的【注意事项】一节。这将有助于更好的理解本章的实现。 一.单线程文件传输(I): ·服务器端(负责发送数据)的实现 1.建立一个基于对话框的工程Server,并在建立的过程中选择支持windows socket。 2.在对话框上添加“发送”按钮。 3.为“发送”按钮添加事件BN_CLICKED的响应函数OnSend()。

计算机网络文件传输及管理系统课程设计报告

目录 摘要 (3) 第一章课程设计要求 (4) 一、设计任务 (3) 1.1.1 课程设计内容 (3) 1.1.2、课程设计的基本要求 (3) 二、设计基本思路及相关理论 (3) 1.2.1、TCP/IP协议 (3) 1.2.2、客户机/服务器模型 (4) 1.2.3、设计基本思路 (4) 第二章设计概要 (5) 2.1 功能设计 (5) 2.2 程序系统功能模块 (6) 2.3 功能分析 (7) 2.3.1 功能流程图: (7) 2.3.2 程序主要功能说明 (7) 第三章调试分析与测试结果 (23) 3.1服务器端与客户端 (23) 3.2文件管理的过程 (26) 第四章设计总结 (28) 参考文献 (28) 课程设计评分表 (30)

摘要 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 关键字:Socket、文件传输、多线程

内部文件传输管理方案

内部文件传输管理方案 一:目前情况: 目前内部没有文件服务器,工作人员资料均存储在本地电脑上,无法实现重要资料的备份及资料的共享。重要数据的保存存在比较大的隐患。一但系统瘫痪或病毒爆发,极有可能使重要数据丢失而造成重大的损失。同时,在对资料的共享及管理方面造成难以管理的情况。无法有效的实现资料的共享使用及数据的安全。基于以上种种情况,建议架设内部文件服务器。 文件服务器的作用:一,数据备份,确保数据安全。造成数据掉失的主要有以下原因:1,物理故障2,人为误操3,软件问题4,病毒木马及黑客5,机器掉失及被盗6,工作人员恶意破坏7,自然灭害。由此可见数据时刻存在风险,也可以明白数据备份的重要性。二,数据实时共享,提高工作人员工作效率。在企业里,数据共享就如人体的血液,数据能否迅速共享有着重要。三,迅速从事故中恢复正常状态。由于数据掉失或系统瘫痪等原因至使破坏工作人员正常工作的环境,在这情况下迅速恢复工作人员正常工作环境尽量缩短恢复正常状态的时间显得特别重要。例如:工作人员系统瘫痪,重做系统及安装应用程序等会化费大量的时间,但利用服务器及软件的配合可以在十几分钟内让工作人员的恢复到正常环境,而不影响工作。四,减少U盘使用,从源头防止病毒交叉感染。建立文件服务器后,可以改变以往通过U盘传输交换文件的方式,从而避免病毒交叉感染的

风险。 二:软硬件需求: 1.由于服务器是运行关键应用及确保数据安全的设备,所以服务器的稳定,性能,及服务特别重要。服务器必须能够7*24不间断服务,服务器要有足够的性能去运行应用以及服务器必须在故障时能迅速恢复过来。它采用专利的三大内存保护技术、RAID 技术、热插拔技术、冗余电源、冗余风扇等方法使服务器具备容错能力、安全保护能力。2 软件需求:windows server 2003或Windows server2008 一套。 三:配置规划: 1.硬件方面: 服务器 交换机 中转机 终端设备(该项建议删除,如果需要增加计算机则保留) 2、从硬件上保证系统的可靠性和稳定性,当其中一颗硬盘物理上出现故障,系统将不会受到影响,仍然可以正常提供服务。只需后续更换故障硬盘。(该项也可以删除,购置新服务器后供应商在安装的时候你提出配raid5 或其他阵列方式即可) 服务器硬盘共分为C:D:E:F:四个逻辑分区。 C:区为系统区,用于安装服务器系统。 D:区为软件区存放系统所用软件。

计算机网络技术考点个人总结

第一章概述 一、普遍传输技术:(1)广播式链接:广播网络(一对所有,机器选择接收)、多播网络(一对多,)(2)点到点链接:单播(点对点,一对一) 越小,地理位臵局部化的网络倾向于使用广播床书模式,而大的网络通常使用点到点的传输模式。 二、网络分类 按覆盖范围分:局域网(LAN)、城域网(MAN)、广域网(WAN) 广域网由通信子网连接起来的,通信线路和路由器(不包含主机)的集合构成了子网。 按传输媒介分:铜线、双绞线、光纤、无线链路 三、协议 概念:通信双方关于如何进行通信的一种约定,规定对等实体之间所交换的消息或者分组的格式和含义。 三要素:(1)语法用来规定信息格式; (2)语义用来说明通信双方应当怎么做; (3)定时关系详细说明事件的先后顺序。 接口:在每一对相邻层之间是接口,接口定义了下层向上层提供哪些原语操作和服务 服务:某一层向它上一层提供一组原语(操作),定义用户执行哪些操作,但不涉及如何实现。 实体:任何可以发送或接收信息的硬件或软件进程。在许多情况下,实体就是一个特定的软件模块。 网络体系结构:层和协议的集合称为网络体系结构。网络体系结构定义计算机设备和其他设备如何连接在一起以形成一个允许用户共享信息和资源的通信系统 四、面向连接与无连接的服务 面向连接的服务:为了使用面向连接的网络服务,用户首先要建立一个连接,然后使用该链接,最后释放连接,传输数据保持原来的顺序。面向连接的服务是基于电话系统模型的。如:文件传输、报文序列和字流节(远程登录)、数字化的语音 面向无连接的服务:每一条报文都携带了完整的目标地址,每条报文都可以被系统独立的路由,首先发送的报文会先到达(不排除延迟)。基于邮政系统模型。如:不可靠的数据报(电子垃圾邮件)、有确认的数据报(挂号信)、请求—应答(数据库查询) 五、参考模型 OSI参考模型:物理层(为数据链路层提供物理连接,以便透明的传送比特流) 数据链路层(传送以帧为单位的数据,采用差错控制与流量控制) 网络层(控制子网运行过程) 传输层(提供可靠端到端的服务,透明的传送报文) 会话层(会话进程之间的通信,管理数据交换) 表示层(所传递信息的语法和语义) 应用层(最高层,包含各种协议) TCP/IP参考模型:主机至网络层(相当于OSI的数据链路层和物理层) 互联网层(相当于OSI的网络层) 传输层(相当于OSI的传输层) 应用层(相当于OSI的应用层、表示层、会话层) 两模型的比较:OSI的核心:(1)服务;(2)接口;(3)协议 OSI的协议比TCP/IP有更好的隐蔽性,当技术发生变化的时候,OSI协议相对更加容易被替换为新的协议,且OSI更具通用性。协议一定会符合TCP/IP模型,但TCP/IP不适合任何其他的协议栈。OSI模型的网络层同时支持无连接和面向连接的通信,但是传输层上只支持面向连接的通信。TCP/IP的网络层上只有一种模式(即无连接通信),但是在传输层上同时支持两种通信模式。 缺点:

怎样不联网在两台电脑之间传输大文件

怎样不联网在两台电脑之间传输大文件(原创) 昨日,本人因需从笔记本传一个5G多的文件到另一台电脑。本打算将压缩文件裁剪,用4G的U盘分两次传输,最后因为怕损坏文件,此想法被扼杀在摇篮中。。。 经研究,结合资料。本人发现一种较适合大学生、半网盲、以及那些低中产阶层人群的方法,简单易懂,现分享如下: 1. 设备:两台电脑(笔记本也可),一根网线(无所谓上不上网),两台电脑均有网卡,已安装文件和打印机共享设备。 2. 步骤:(1)将两台电脑用网线连接; (2)在一台电脑上,打开网上邻居——设置家庭或小型办公网络——网络安装向导,单击下一步、下一步,选择其他——选择:这台计算机属于一个没有Internet连接的网络——下一步——计算机描述,随便填一个自己能记住的名称——下一步——工作组名(默认的即可)——启用文件和打印机共享。另一台做同样的设置,而且要保证两台电脑在同一工作组。好了这就把小型局域网建好了。 (3)传文件:打开网上邻居,你会在一台电脑的网上邻居中看到两个共享文件夹,其中一个是默认的当前电脑里的共享文件夹,这个打不开。传文件时,把硬盘里的大文件移动到自己的共享文件夹里(记住是自己的,而能打开看到的是另一台电脑共享文件),这样另一台电脑在你的共享文件里就能看到传输的文件了,复制下来到自己的硬盘里就OK了。 3. 注意在传输中不要断开网线!有时候360等会检测出共享安全漏洞,没关系的,忽略就行了。 4. 这个传输过程的原理就是建立小型局域网,使两台电脑在同一局域网内,通过网线进行高速传输,我试过一个6G的文件(比如大型的3D游戏)大概用15分钟左右。。。想想家里才400kb/s的下载速度,简直是龟兔赛跑吧。。。 另外我还声明是在不联网的情况下,如果有网QQ传输,或用设置一下用飞鸽传输更快。当然你如果富裕的话,几个8G的U盘就搞定了,关于此法大文件无法移动的现象没有解决,还有待改进。。。欢迎转载和分享!

计算机网络课程设计报告文件传输协议的简单实现

课程设计 课程名称计算机网络课程设计 题目名称文件传输协议的简单设计与实现学生学院 专业班级___ _ 学号 学生姓名______ _________ 指导教师______ _____ 2010 年 1 月 5 日

设计摘要 关键词:SOCKET编程,FTPclient/server程序 摘要:本课程设计包含了文件传输协议的简单设计与实现。 文件传送是各种计算机网络实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。文件传输协议的简单设计与实现建立在计算机网络实验环境TCP/IP 网络体系结构之上,使用socket 编程接口编写两个程序,分别为客户程序和服务器程序(),实现下述命令功能:get , put, pwd, dir, cd, ?, quit 等,利用了已有网络环境设计并实现简单应用层协议。 本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,实验运行结果,核心程序,个人体会及建议等。

目录 1、文件传输协议的简单设计与实现------------------------------18 1. 1 具体设计任务----------------------------------------------18基本思路及所涉及的相关理论--------------------------------18 1.2.1基本思路-------------------------------------------------18 2.2.2 相关理论--------------------------------------------18 设计流程图------------------------------------------------19 实验运行情况----------------------------------------------19 核心程序--------------------------------------------------22 2.5.1 服务器(sever)程序---------------------------------22 2.5.2 客户(client)程序----------------------------------29 心得体会-----------------------------------------------------------------------------37 参考文献--------------------------------------------------------38

文件传送常用的三种方式FTP

文件传送常用的三种方式FTP、Email及“网上邻居”都在一定程度上实现了文件数据的交流,但它们都主要面向“点对点”的传送,无法实现“一块空间,资源互见”的应用需求,这种基于“点对多”的共享模式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。 常用传输方式及其在特定环境下面临的困难 我们经常有这样的应用需求:通过网络交换公共数据文件以实现资源共享,同时保护私有数据不被非法访问,并使用简单、直观的方式操作。我们常用的文件传输FTP、Email邮件、网上邻居都能实现文件的传送。其中,"Ftp"功能最为强大,但使用起来却稍显复杂,一大堆设置足以让许多人望而止步,尤其用户数量不可预见时,针对特殊需求用户的设置将更加繁琐;"Email"是大家所熟悉的了,但它的传送不仅需要你连入Internet,而且它的安全性也是个问题,在企业内部,财务、劳资等文件资料需通过这种方式交流不是好办法;"网上邻居"是又一种传送文件的方法,通过在本机上指定共享的Web文件夹并放置资源文件,一定范围内的用户可以访问到这些文件,然而这种方式使用的范围相当有限,通常在同一个DNS段地址内的用户才能顺利访问,其它尤其是Internet上的用户,很难使用,此外同Email类似,它的使用也不直观,很多时候你不得不在许多列表计算机上一层层展开搜索才有可能获取你想要的资源! 由此看来,以上三种方式虽然在一定程度上实现了文件数据的交流,但它们都主要面向"点对点"的传送(你只能被动地等对方放置数据而不能主动"可视化"地索取),无法实现"一块空间,资源互见"的应用需求,这种基于"点对多"的共享方式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。 网络硬盘的优势 网络硬盘(也称共享空间),是服务器上的一块硬盘空间,在这里,如果你具备足够的权限,你可以对它随意操作,就象使用你的本地计算机一样。要知道,这一切以Http的方式传输,以Web的形式展现在所有用户面前,通过浏览器这种熟悉的方式访问,这样,"一块空间,资源互见"的共享模式得以实现!

计算机网络技术学习心得体会

计算机网络技术学习心得体会: 1世纪是一个信息经济时代,为适应时代的发展,作为一名当代大学生,所受的社会压力将比任何时候的大学生都要来得沉重,因此在校期间,我们必须尽可能的利用好学习时间,尽可能地学习更多的知识和能力,学会创新求变,以适应社会的需要。 毕竟,不管将来是要从事什么样的相关行业,都需要掌握较为全面的计算机知识,因为小到计算机的组装维修,大到服务器的维护与测试,知道的更多更全面,那么对于自己以后找工作以及参加工作帮助就越大。在知识经济时代,没有一个用人单位会傻到和知识作对,不是么? 基于这样对社会现状的认识,让我积极、认真地对于学习计算机课程有了较为良好的心理基础。而我在第一次接触计算机就觉得很新鲜,觉得很奇妙,上网、玩游戏什么的操作都很是简单,但随着需求的变化,自己对电脑接触的不断深入,对计算机的认识越来越深,特别是进到大学,专业要求进行电脑利用数据画图、学习了各种操作并不简单的办公软件等等之类。 更令人恼火的是,当在制图、办公过程中,遇到一些电脑系统出错导致文件成果丢失的令人恼火的突发问题时,我才深深地感受到自己计算机知识是多么的欠缺,自己终归不是学计算机专业的,对计算机知识的掌握都是零散的,对这些突发问题只能束手无策。但大一并没有相关计算机课程,更多的时候只能自学,在第一个学年结束后,为了自己知识的充实,也为了响应学校计算机课程的改革的号召,我带着课程相关的两本教科书坐上了回家的火车,同时,也开始了一段并不一昧玩乐的大学第一个暑假。 翻开主教材的第一节,我不禁有点傻眼,和我想象中的第一节不一样,它不是什么我们会、却不精通的软件的相关学习(受大一专业课教材的影响),而是在我的观念世界里地球人都能做到的----电脑开

文件传输系统1需求分析

文件传输系统 分类: 企业工资管理系统 需求规格说明书项目承担部门:计算机应用1 班 撰写人(签名): 完成日期: 本文档使用部门:■主管领导■项目组 ■客户(市场)■维护人员■用户评审负责人(签名): 评审日期:

引言 (3) 1.1编写目的 (3) 1.2项目风险 (3) 1.3参考文献 (3) 2. 综合描述 (3) 2.1产品的状况 (3) 2.2产品的功能 (3) 2.3用户类和特性 (3) 3. 外部接口需求 (4) 3.1用户界面 (4) 3.2软件接口 (4) 4. 系统功能需求 (4) 4.1输入/输出数据 (5) 5. 其它非功能需求 (7) 5.1性能需求 (7) 5.2安全性需求 (7) 5.3软件质量属性 (7) 5.4业务规则 (7) 5.5用户文档 (7) 6. 词汇表 (8) 7. 待定问题列表 (11)

引言 伴随着管理自动化的逐步深入,政府、企业、事业单位和各级政府机关部门对工资管理自动化的需求也越来越完善,在这样的大环境下,我们独立设计开发了一个同时具有协同办公,协同管理功能的《网络工资管理系统》。 1.1 编写目的 在充分理解工资管理系统一般需求的基础上,根据现实用户的需要,我们设计此方案,来最大限度满足用户的需要,同时方面与软件的维护与升级。 。 1.2 项目风险 本软件可能开发的周期比较长。 1.3 参考文献 《湖北省机关事业单位工资改革方案》 2. 综合描述 软件只需维护人员学历、简历、年度考核信息,人员工资完全不必人工干预。 2.1 产品的状况 类似的产品,现在很少有网络功能,系统的交互性不强。 2.2 产品的功能 根据国家工资政策,结合人事工资实际,为计算、管理机关事业单位人员工资而设计的专门系统,与湖北省工资套改软件一脉相承,实现了二者的无缝连接。其主要特点简单易用。 2.3 用户类和特性 本系统分为三类用户:总管理员、单位管理员、普通用户

计算机网络工程师工作总结

计算机网络工程师工作总结 总结是对自身社会实践进行回顾的产物,它以自身 工作实践为材料。以下是为大家精心整理的计算机网络 工程师工作总结,欢迎大家阅读,供您参考。更多内容 请关注。 计算机网络工程师工作总结(一) 窗外枯枝寒风摧,又是一度年终时,翻开过去一年 的工作录,步履艰辛忐忑而又让人意味深长。过去的一年,在公司领导和同事的悉心指导和大力支持下,我对 工作稳步熟悉,取得了一定的成果,但也存在着诸多不足,现将本年度工作总结及下阶段工作计划汇报如下: 一、求真务实,脚踏实地,在技术工作开展的前提 上不断创新 刚到公司一段时间工作的过程也是我自己心态不断 调整、成熟的过程。因为初来乍到,很多东西都不适应,我有太多的茫然。当时我整天预想到某个项目现场大展 身手,但我发现现实离我预期有很大的差距,而莫名而 来的一些烦琐的标书协助制作更是让我抓狂。我甚至怀 疑我是否合适这份工作,但我一直不断的提醒自己要坚持,调整心态。经过了一段时间的磨合,我才慢慢适应 并逐渐进入工作状态。

作为公司技术部的一名员工,主要负责公司技术类 工作,本年度,在部门经理的安排指导及部门同事的配 合下,我参与了省人大方卡消费机建设项目、省政协会 议签到系统项目、省红十字会服务器升级项目、省信息 中心服务器采购项目、省档案馆服务器维护项目、XX区 教育局服务器采购安装项目、国电宜兴光伏智能化建设 项目、国电朗新明XX分公司机房建设项目、国电XXXX 旗视频监控建设项目、国电阿拉善左旗视频监控维护项 目等各种环节的工作。 在公司内部,我参加了公司网站建设升级项目,公 司XX网上购物商城建设项目的工作。 二、积极上进、沟通交流,在思想态度端正的基础 上创一流服务 在思想上我们部门与公司总体制度方针保持高度一致,遵守公司出台的各项规章,响应公司号召,积极参 加公司的各种活动。不无迟不旷工,遇事及时汇报,积 极与上级领导沟通交流。 在工作中,部门内团结互助,齐心协力,相互分享 工作经验,工作效率也因此大大提升;在工作外,部门 经理经常带领我们开展各种各样的活动,关心帮助大家,同事关系融洽。 在与客户沟通交流的过程中,我主动热忱,按时守

计算机网络公开课教案

公开课教案 科目:计算机网络 课题: 交换机配置文件备份与恢复 知识目标: 1、在本次课中要向学生传授交换机上传、下载服务器的安装和配置; 2.学生学习交换机上传配置命令,完成交换机Flash内存中保存的配置文件上传到服务器备份功能; 技能目标: 1.学生通过本次课学习能较好较快完成交换机配置电缆的连接和登录交换机命令操作平台; 2.学生能成功搭建交换机上传(TFTP)服务器; 3.学生能较好利用交换机机配置命令完成交换机上传备份; 情感目标: 1.培养学生细心、仔细,严谨的工作作风 2.培养学生对待操作性质的工作要按步骤操作,做到有条不紊的工作作风。

教学重点:Copy配置命令 教学难点:多个设置IP和Copy的使用 教学形式:讲解、演示、操作 教学设备:DCS-3950交换机、调试线、网络、交流电源线 教学课时:1课时 教学地点:江阳职高教学楼6-1 教学内容: 一.引入部份 1、复习上次课内容 (1) 恢复出厂设置命令 Set default 配置过程: switch>enable switch#set default Are you sure? [Y/N] = y switch#write switch#show startup-config This is first time start up system. switch#reload Process with reboot? [Y/N] y (2) 新课引入 对交换机做好相应的配置之后,管理员会把正确的配置文件从交换机上下

载并保存在稳妥的地方,防止日后如果交换机出了故障导致配置文件丢失的情况出现。有了保存的配置文件,直接上载到交换机上,就会避免重新配置的麻烦。 二.新课内容 1、交换机配置文件上传、下载技术 交换机上传、下载技术不能延用计算机传统的技术(如:FTP、HTTP等),而要用交换机、路由器等网络设备的专用上传、下载技术,即TFTP技术 如拓扑图 TFTP:简单方面讲是一种软件,TFTP是FTP服务器的简化版本,特点是功能不多,小而灵活。 TFTP使用方法: 1.准备好TFTP软件,可从互联网上下载或网络设备商提供。 2、需安装TFTP软件,安装了TFTP的计算机就称为TFTP服务器。该电脑就具备了与网络设备进行上传、下载的功能。

基于Tcp的文件传输

Linux下基于Tcp的文件传输 一.服务器: #include #include #include #include #include #include #include #define SERVER_PORT 6666 #define LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 int main(int argc,char **argv) { struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr));//全部置零 //设置地址相关的属性 server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htons(INADDR_ANY); server_addr.sin_port=htons(SERVER_PORT); //创建套接字 int server_socket=socket(AF_INET,SOCK_STREAM,0); if(server_socket<0) { printf("socket create error\n"); exit(1); } //绑定端口 if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) { printf("bind error\n"); exit(1); } //服务器端监听 if(listen(server_socket,LISTEN_QUEUE)) { printf("Server listen error\n"); exit(1); }

数据传输软件(发送端)使用说明

z发送端软件说明 1. 登录 双击StoneWall-2000(发送端).exe图标,运行发送端软件。 系统将弹出如下图所示的登录对话框。 初始化 第一次使用本设备, 需要有初始化的过程,只需输入administrator. 然后点击”确定”, 会提示没有设备的密钥. 图1 初始化提示 点击“确定”后, 会出现“创建系统密钥”对话框, 输入一个使用”文件发送端软件”的密钥文件的使用口令.这个文件是公私钥对中私钥的密钥保护口令. 在确认您输入口令和验证口令一致之后,系统会自动生成以后用来密钥协商和文件加密传输的密钥对. 图2 密钥生成对话框

图3 密钥生成成功确认 密钥生成成功之后,登陆软件发送端. 图4 发送端登录对话框 在用户名栏中添入正确的用户名,缺省为administrator,在密码栏中添入正确的密码,缺省为12345678,输入第一次初始化设备时候的密钥保护口令.登入系统. 关于如何增加、删除用户及修改密码,在后续章节介绍。强烈建议用户在首次登录后更改管理员密码,以保证软件的安全使用。 如果想放弃登录,请用鼠标单击退出按钮。 用户名必须为英文、数字或下划线,其他非法字符将无法显示。 添入了正确的用户名或密码后,按回车键或用鼠标单击确定按钮即可以进入发送端软件主界面,如下图所示。

图5 发送端主界面 2. 发送端软件主界面说明如下: 菜单区——用于发送端软件的配置 待发送文件和已发送文件显示区——用于显示准备发送数据到的目的主机IP和路径。 本地资源显示区——用于显示本机的文件资源。 日志文件显示区——用于显示日志记录。 文件传输状态显示区——用于显示当前和曾经发送的文件的传输状态。 文件内容显示区——用于文件内容显示。 3. 发送端软件主界面操作如下: 3.1.文件发送 若在待发送文件显示区中没有用户要发送文件的目的主机和目的路径,用户可以从本地资源显示区中选择要发送的文件或文件夹,双击该文件或文件夹,将弹出如图3的任务设定窗口。用户需要在任务设定窗口中添如目的IP,端口号和文件在接收端目的存储路径。用户可以点击“高级”按钮得到如图4的窗口。共有四种发送模式可以选择:立即发送,立即发送并作增量检查,定时发送和周期发送。 若文件或文件夹的目的主机或目的路径在待发送文件夹树中已经存在,用户也可以用鼠 标拖动要发送的文件或文件夹到该目的主机IP节点处或目的路径节点处释放,则用户可以

计算机网络学习心得体会

计算机网络学习心得体会 如今已经是信息时代,作为主流信息工具的网络越来越重要,因此我选择了这门选修课程。我个人对于电脑和网络是很感兴趣的,但由于学习的东西不多,经常是在玩游戏,真正运用到网络的技术性的东西实在少到可怜。象做博客,我只是会一般的做法,也能把它搞得与众不同,但我全然不知道其中的奥秘。象代码之类的东西,我以前只是耳闻,半点也不懂。学了这门课程后,虽然懂的不是很多,但已经不是什么都不知道的了,简单得运用一些代码还是会的,这也就行了。我并不要求学得很精深,毕竟我将来并不是干这行的。而制作网页的知识,学了一点,也会做一些简单的网页了,其实我觉得这就够了,我还没有想做自己的网页发布到网上的念头。但我不是说不要学习计算机网络技术,相反,我们学地越精深越好,我的观点只能代表我个人的想法,毕竟这个时代学得越多,活得更好的可能性就越大。只不过人的精力有限,只能学到你能承受的地步。如果精力旺盛,足够学一切技术,自然也没人反对。网络之中目前我最感兴趣的还是做博客,时不时写些自己的感悟或者转载些别人的好文章,上传一些漂亮的图片和朋友们分享,这让人感觉到难得的愉悦。好东西,大家一起分享才有意思。计算机网络系统是一个集计算机硬件设备、通信设施、软件系统及数据处理能力为一体的,能够实

现资源共享的现代化综合服务系统。计算机网络系统的组成可分为三个部分,即硬件系统,软件系统及网络信息系统。1.硬件系统硬件系统是计算机网络的基础。硬件系统有计算机、通信设备、连接设备及辅助设备组成,如图1.6.4所示。硬件系统中设备的组合形式决定了计算机网络的类型。下面介绍几种网络中常用的硬件设备。⑴服务器服务器是一台速度快,存储量大的计算机,它是网络系统的核心设备,负责网络资源管理和用户服务。服务器可分为文件服务器、远程访问服务器、数据库服务器、打印服务器等,是一台专用或多用途的计算机。在互联网中,服务器之间互通信息,相互提供服务,每台服务器的地位是同等的。服务器需要专门的技术人员对其进行管理和维护,以保证整个网络的正常运行。⑵工作站工作站是具有独立处理能力的计算机,它是用户向服务器申请服务的终端设备。用户可以在工作站上处理日常工作,并随时向服务器索取各种信息及数据,请求服务器提供各种服务(如传输文件,打印文件等等)。⑶网卡网卡又称为网络适配器,它是计算机和计算机之间直接或间接传输介质互相通信的接口,它插在计算机的扩展槽中。一般情况下,无论是服务器还是工作站都应安装网卡。网卡的作用是将计算机与通信设施相连接,将计算机的数字信号转换成通信线路能够传送的电子信号或电磁信号。网卡是物理通信的瓶颈,它的好坏直接影响用户将

计算机网络原理 文件传输的概念

计算机网络原理文件传输的概念 文件传输提供的服务相对简单。文件传输是指用户直接将远地服务器上的文件复制到本地计算机中,或者将本地计算机中的文件复制到远程服务器。远程文件一旦复制到本地计算机时,便属于本地计算机中的文件,与远地服务器中的文件无关,用户可以对它进行任何权限内的操作,文件传输通常只用于只读数据。当然,用户也可以把从远地服务器中的文件复制过来进行修改,再通过文件传输协议将该文件复制到服务器。 文件传输与文件访问的最直接的区别是:文件传输在读/写文件之前,需要将远程服务器文件(原文件)复制到本地计算机中;而文件访问不需要复制文件,若干用户可以同时在原文件上直接进行操作。 FTP(File Tran Protocol)是Intemet上使用最广泛的文件传输协议。它提供交互式的访问,允许用户指明文件类型和格式,并允许对文件具有存取权限。FTP屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件。 简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中复制至远程计算机上,则称之为“上载(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port 方式数据端口为20。FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。 FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。 ●ASCII传输方式用户在复制文件时,包含简单ASCII码文本。如果在远程计算机上 运行的不是UNIX操作系统,则文件在传输过程中,ftp通常会自动地调整成远程计 算机可以存储文本文件的格式。例如,我们所传输的是程序,数据库,字处理文件 或者压缩文件等。 ●二进制传输模式在二进制传输中,保存文件的位序,以便原始和复制的是逐位一 一对应的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对 方系统上,此文件不能执行。 如果在ASCII方式下传输二进制文件,也会将文件转译。这会使传输稍微变慢,也会损坏数据,并且传输过去的文件不能使用。 提示早期的文件传输是通过客户端计算机调用命令与服务器建立连接(这个连接叫做控制连接,用于双方传输控制信息,而非传输数据。),一旦建立起控制连接,双方便进入交互式会话状态。然后,客户端用户每调用一个ftp命令,客户进程便与服务器之间再建立一个数据连接并进行文件传输。等到该ftp命令执行完后,再回到交互会话状态,可继续执行其他ftp命令。最后,用户键入close和quit命令,退出FTP会话。

相关文档
最新文档