VC++ 实现文件上传下载服务器端

#pragma once#include #define   WM_FILELIST   WM_USER + 101  //接收文件列表#define   WM_FILEUPDATE  WM_USER + 102  //反映文件下载状态#define   WM_FILEDOWNLOAD  WM_USER + 103    //发送文件列表#define   FILE
摘要由CSDN通过智能技术生成


#pragma once
#include <afxsock.h>

#define   WM_FILELIST   WM_USER + 101  //接收文件列表
#define   WM_FILEUPDATE  WM_USER + 102  //反映文件下载状态
#define   WM_FILEDOWNLOAD  WM_USER + 103    //发送文件列表


#define   FILELIST      1000    //请求文件列表
#define   FILEUPDATE   2000    //请求文件上传
#define   FILEDOWNLOAD  3000    //请求文件下载

#define   RECVSIZE   1024*16       //一次性发送/接收的数据块大小

//与服务器通信语言结构
typedef struct
{
 int  iCommand;
 long lFileOffset;
 long lFileLength;
 char sFilePath[128];
}MSGFILE;

//请求线程参数
typedef struct
{
 char sIP[15];  //IP地址
 int  iPort;   //端口
 MSGFILE msgFile; //通信语言结构
 LPVOID ptr;  //指针
}MSGPARAM;

//文件列表结构
typedef struct
{
 long lFileLength;
 char sFilePath[128];
}MSGFILELIST;

//反映文件状态的结构
typedef struct
{
 long lFileOffset;//偏移
 char sFilePath[128];//路径
}MSGFILESTATUS;

//接收线程参数
typedef struct
{
 SOCKET sock;
 LPVOID ptr;
}PARAMRECV;



//服务器端 类 头文件

// Ftp_Server.h: interface for the CFtp_Server class.
//
//

#if !defined(AFX_FTP_SERVER_H__DCFE7BE8_C212_475E_AAC8_811898047B46__INCLUDED_)
#define AFX_FTP_SERVER_H__DCFE7BE8_C212_475E_AAC8_811898047B46__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "basedef.h"
#define WM_FINISHUPDATE WM_USER+401

class CFtp_Server 
{
public:
 CFtp_Server();
 virtual ~CFtp_Server();

 BOOL StartListen(CWnd *pWnd, int nPort, char *sPath);
 void StopListen();

protected:
 //监听线程
 static DWORD WINAPI ListenThread(LPVOID lpParam);
 
 //接收线程
 static DWORD WINAPI RecvThread(LPVOID lpParam);
private:
 //监听线程结束符
 BOOL m_bEndListenThread;

 //监听端口
 int m_iListenPort;

 //窗口指针
 CWnd* m_pWnd;

 //服务器套接字
 SOCKET m_socket;

 //保存本机地址
 SOCKADDR_IN m_sin;

 //存储路径
 char m_sPath[128];
};

#endif // !defined(AFX_FTP_SERVER_H__DCFE7BE8_C212_475E_AAC8_811898047B46__INCLUDED_)



//服务器端 类 CPP

// Ftp_Server.cpp: implementation of the CFtp_Server class.
//
//

#include "stdafx.h"
#include "Ftp_Server.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CFtp_Server::CFtp_Server()
{
}


CFtp_Server::~CFtp_Server()
{
}


BOOL CFtp_Server::StartListen(CWnd *pWnd, int nPort, char *sPath)
{
 //初始化套接字
 if (!AfxSocketInit())
 {
  return FALSE;
 }

 //获得端口号和窗口指针
 m_iListenPort = nPort;
 m_pWnd = pWnd;
 strcpy(m_sPath, sPath);

 m_bEndListenThread = FALSE;//开始监听

 DWORD id;
 HANDLE h = CreateThread(NULL, 0, ListenThread, this, 0, &id);//创建句柄
 //线程要执行的函数为ThreadListen,将this指针传递给线程,线程ID为id,创建成功,返回新线程的一个句柄
 CloseHandle(h); //关闭句柄,并不终止线程

 return TRUE;
}


void CFtp_Server::StopListen()
{
 m_bEndListenThread = TRUE;
 Sleep(100);
 closesocket(m_socket);
}


DWORD WINAPI CFtp_Server::ListenThread(LPVOID lpParam)
{
 CFtp_Server* pServer = (CFtp_Server*)lpParam;

 SOCKET sockListen = socket(AF_INET, SOCK_STREAM, 0);//创建socket
 //地址家族为internet,用于TCP和UDP,字节流,特定的协议

 SOCKADDR_IN sin; //转换地址
 sin.sin_family = AF_INET;
 sin.sin_addr.s_addr = 0; //ip地址,以网路字节顺序。
 sin.sin_port = htons(pServer->m_iListenPort);

 if (bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
 {
  closesocket(sockListen); //关闭socket
  return FALSE;
 }

 if (listen(sockListen, 5) == SOCKET_ERROR)
 {//若将socket置于监听失败
  closesocket(sockListen);
  return FALSE;
 }

 fd_set fdListen;//结构体,将socket放进一个集合
 timeval seltime;//结构体,指定时间值(秒+毫秒)
 seltime.tv_sec = 0; //秒
 seltime.tv_use

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC是一种常用的开发平台,可以用来实现各种功能,包括FTP文件下载。在VC中,可以使用WinINet API来实现FTP下载功能。 首先,我们需要在VC中添加相应的头文件和链接库。头文件包括<Windows.h>和<Wininet.h>,链接库为wininet.lib。 接下来,我们需要使用一些关键函数来实现FTP下载。首先是InternetOpen函数,用于初始化WinINet库,并创建一个用于FTP操作的会话句柄。然后,使用InternetOpenUrl函数来打开FTP服务器上的文件,获取到文件的句柄。接着,使用InternetReadFile函数来读取文件内容,并将其写入本地文件中。最后,使用InternetCloseHandle函数关闭句柄,释放资源。 具体实现代码如下所示: ```c++ #include <Windows.h> #include <Wininet.h> void DownloadFTPFile(const char* ftpUrl, const char* localFile) { HINTERNET hInternet = InternetOpen(L"FTPDownloader", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (hInternet == NULL) { return; } HINTERNET hFtpSession = InternetOpenUrlA(hInternet, ftpUrl, NULL, 0, INTERNET_FLAG_RELOAD, 0); if (hFtpSession == NULL) { InternetCloseHandle(hInternet); return; } HANDLE hLocalFile = CreateFileA(localFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hLocalFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); return; } char buffer[4096]; DWORD bytesRead; while (InternetReadFile(hFtpSession, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) { DWORD bytesWritten; WriteFile(hLocalFile, buffer, bytesRead, &bytesWritten, NULL); } CloseHandle(hLocalFile); InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); } int main() { const char* ftpUrl = "ftp://example.com/path/to/ftpfile.txt"; const char* localFile = "C:\\localfile.txt"; DownloadFTPFile(ftpUrl, localFile); return 0; } ``` 以上是一个简单的VC程序,用于实现FTP文件下载功能。在使用时,只需将FTP服务器的URL和本地文件的路径传递给DownloadFTPFile函数即可。程序将会从FTP服务器下载文件,并保存到本地文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值