C++的客户端有两种,一种是界面的MFC的版本,另外一种是自己参照mfc修改的命令框的形式的,基本的功能是一样的。
mfc的版本主要是图形框的选择一般是系统自己生成的函数如下:
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CFileTranslaterClientDlg 对话框
CFileTranslaterClientDlg::CFileTranslaterClientDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_FILETRANSLATERCLIENT_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFileTranslaterClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
// DDX_Control(pDX, IDC_IPADDRESS1, serverIP);
DDX_Control(pDX, IDC_LIST1, messageList);
DDX_Control(pDX, IDC_IPADDRESS1, severIP);
DDX_Control(pDX, IDC_EDIT1, UpLoadName);
DDX_Control(pDX, IDC_EDIT2, download_path);
}
BEGIN_MESSAGE_MAP(CFileTranslaterClientDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CFileTranslaterClientDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &CFileTranslaterClientDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CFileTranslaterClientDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CFileTranslaterClientDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON5, &CFileTranslaterClientDlg::OnBnClickedButton5)
ON_EN_CHANGE(IDC_EDIT2, &CFileTranslaterClientDlg::OnEnChangeEdit2)
ON_EN_CHANGE(IDC_EDIT1, &CFileTranslaterClientDlg::OnEnChangeEdit1)
ON_BN_CLICKED(IDC_BUTTON4, &CFileTranslaterClientDlg::OnBnClickedButton4)
END_MESSAGE_MAP()
// CFileTranslaterClientDlg 消息处理程序
BOOL CFileTranslaterClientDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CFileTranslaterClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CFileTranslaterClientDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFileTranslaterClientDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CFileTranslaterClientDlg::OnBnClickedOk()
{
CDialogEx::OnOK();
}
然后就是客户端对服务端的socket的服务的连接
void CFileTranslaterClientDlg::OnBnClickedButton1()
{
//初始化 socket dll
WSADATA wsaData;
WORD socketVersion = MAKEWORD(2, 2);
assert(WSAStartup(socketVersion, &wsaData) == 0);
//创建socket
client_socket = socket(AF_INET, SOCK_STREAM, 0);
assert(SOCKET_ERROR != client_socket);
//指定服务端的地址
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
CString SERVER_IP;
severIP.GetWindowTextA(SERVER_IP);
server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(PORT);
if (SOCKET_ERROR != connect(client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
{
messageList.AddString("连接成功");
}
else
{
messageList.AddString("连接失败");
}
//BOOL result = connectSever("127.0.0.1", 1982);
}
之后就是对文件路径的选择此处属于mfc一些专属函数:
void CFileTranslaterClientDlg::OnBnClickedButton2()
{
CFileDialog opendlg(true, NULL, NULL, 0, "All Files(*.*)|*.*||");
if (opendlg.DoModal() == IDOK) { //显示对话框并允许用户进行选择。
upload_file_location = opendlg.GetPathName(); //文件路径
UpLoadName.SetWindowTextA(upload_file_location); //在编辑框显示文件路径
messageList.AddString("打开文件成功");
}
}
文件的上传的步骤主要是,打开文件,用二进制读取文件的内容,及用函数来获取文件的路径进行验证
void CFileTranslaterClientDlg::OnBnClickedButton3()
{
//标识上传 send(client_socket,"1", sizeof("1"), 0);
char FileLocation[FILE_NAME_MAX_SIZE];
strcpy(FileLocation, upload_file_location);
int file_Location_size = strlen(FileLocation);
while (FileLocation[file_Location_size] != '\\'&&file_Location_size > 0) { file_Location_size--; }
char real_name[FILE_NAME_MAX_SIZE];
memset(real_name, 0, sizeof(real_name));
strcpy(real_name, FileLocation + file_Location_size + 1); //在这里存放真实名字
cout << "发送到服务器的真实名字:\t" << real_name << endl; //这个语句是用来测试的
messageList.AddString(CString("要上传的文件是:")+CString(real_name)); //把名字显示在右边
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
if (send(client_socket, real_name, sizeof(real_name), 0) < 0) //标记
{
messageList.AddString("在发送文件名字时出错" + WSAGetLastError());
MessageBox("发送文件名时失败");
}
CString test;
FILE *fp = fopen(FileLocation, "rb"); //以只读,二进制的方式打开一个文件
if (NULL == fp)
{
messageList.AddString("这个文件不存在");
}
else
{
memset(buffer, 0, BUFFER_SIZE);
int length = 0;
while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if (send(client_socket, buffer, length, 0) < 0)
{
messageList.AddString("文件发送失败"+WSAGetLastError());
MessageBox("发送文件时失败");
break;
}
memset(buffer, 0, BUFFER_SIZE);
}
fclose(fp);
}
messageList.AddString("文件发送成功");
std::cout << "文件: " << real_name << std::endl << "发送成功 !" << std::endl;
closesocket(client_socket);
//释放 winsock 库
WSACleanup();
}
文件路径的选择对话框:
void CFileTranslaterClientDlg::OnBnClickedButton5()
{
//打开路径
BROWSEINFO bi;
char Buffer[MAX_PATH] = { 0 };
//初始化入口参数bi开始
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = "打开路径";
bi.ulFlags = BIF_EDITBOX;//包括文件
bi.lpfn = NULL;
bi.iImage = IDR_MAINFRAME;
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if (pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);//取得文件夹路径到Buffer里
}
store_file_location = CString(Buffer);
messageList.AddString("选择存放路径成功:"+store_file_location);
}
void CFileTranslaterClientDlg::OnEnChangeEdit2()
{
download_path.GetWindowTextA(download_file_location);
}
void CFileTranslaterClientDlg::OnEnChangeEdit1()
{
}
最后就是服务器的文件的接受
void CFileTranslaterClientDlg::OnBnClickedButton4()
{
//send(client_socket, "2", sizeof("2"), 0);标识下载
//这是从服务器上下载东西的代码
//输入文件名
char file_name[FILE_NAME_MAX_SIZE + 1];
memset(file_name, 0, FILE_NAME_MAX_SIZE + 1);
std::cout << "输入你想要在服务器上获取的名字:" << std::endl; //测试
strcpy(file_name, download_file_location);
messageList.AddString(CString("要下载的路径:") + download_file_location);
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name)); //取较短的
//向服务器发送文件名
assert(send(client_socket, buffer, BUFFER_SIZE, 0) >= 0);//>=0
//打开文件,准备写入
//这里可以用filename代替
char receive[FILE_NAME_MAX_SIZE];
cout << "你想放在哪里?" << endl;
strcpy(receive, store_file_location);
int file_name_size = strlen(file_name);
while (file_name[file_name_size] != '\\'&&file_name_size > 0) { file_name_size--; }
char real_name[FILE_NAME_MAX_SIZE];
memset(real_name, 0, sizeof(real_name));
strcpy(real_name, file_name + file_name_size + 1);
strcat(receive, "\\");
cout << "接收到的真实名字" << real_name << endl;
strcat(receive, real_name);
FILE *fp = fopen(receive, "wb"); //以只写,二进制的方式打开一个文件wb
assert(NULL != fp);
memset(buffer, 0, BUFFER_SIZE);//初始化
int length = 0;
while ((length = recv(client_socket, buffer, BUFFER_SIZE, 0)) >0)//>0
{
assert(fwrite(buffer, sizeof(char), length, fp) >= (size_t)length);
memset(buffer, 0, BUFFER_SIZE);
}
messageList.AddString("下载成功");
std::cout << "接受文件 : " << file_name << endl << " 接收成功 !" << std::endl;
fclose(fp);
closesocket(client_socket);
}
下面还有一个自己的简易版本就是命令框的
//#include "KeHu.h"
//
//BOOL CFileTranslaterClientDlg::OnInitDialog()
//{
// return 0;
//}
//
//void CFileTranslaterClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
//{
//}
//
//void CFileTranslaterClientDlg::OnPaint()
//{
//}
//
//
//
//
//BOOL CFileTranslaterClientDlg::connectSever(string ip, int port)
//{
// //初始化 socket dll
// WSADATA wsaData;
// WORD socketVersion = MAKEWORD(2, 2);
// assert(WSAStartup(socketVersion, &wsaData) == 0);
//
// //创建socket
// client_socket = socket(AF_INET, SOCK_STREAM, 0);
// assert(SOCKET_ERROR != client_socket);
//
// //指定服务端的地址
// sockaddr_in server_addr;
// server_addr.sin_family = AF_INET;
// //CString SERVER_IP;
//
// //severIP.GetWindowTextA(SERVER_IP);
//
// server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
// server_addr.sin_port = htons(port);
// if (SOCKET_ERROR != connect(client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
// {
// messageList.AddString("连接成功");
// }
// else
// {
// messageList.AddString("连接失败");
// }
//}
//BOOL CFileTranslaterClientDlg::SendFile(string filePath)
//{
// //标识上传 send(client_socket,"1", sizeof("1"), 0);
// char FileLocation[FILE_NAME_MAX_SIZE];
// strcpy(FileLocation, upload_file_location);
// int file_Location_size = strlen(FileLocation);
// while (FileLocation[file_Location_size] != '\\'&&file_Location_size > 0) { file_Location_size--; }
// char real_name[FILE_NAME_MAX_SIZE];
// memset(real_name, 0, sizeof(real_name));
// strcpy(real_name, FileLocation + file_Location_size + 1); //在这里存放真实名字
// cout << "发送到服务器的真实名字:\t" << real_name << endl; //这个语句是用来测试的
//
// messageList.AddString(CString("要上传的文件是:") + CString(real_name)); //把名字显示在右边
//
// char buffer[BUFFER_SIZE];
// memset(buffer, 0, BUFFER_SIZE);
//
// if (send(client_socket, real_name, sizeof(real_name), 0) < 0) //标记
// {
// messageList.AddString("在发送文件名字时出错" + WSAGetLastError());
// MessageBox("发送文件名时失败");
// }
// CString test;
// FILE *fp = fopen(FileLocation, "rb"); //以只读,二进制的方式打开一个文件
//
//
// if (NULL == fp)
// {
// messageList.AddString("这个文件不存在");
// }
// else
// {
// memset(buffer, 0, BUFFER_SIZE);
// int length = 0;
//
// while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
// {
// if (send(client_socket, buffer, length, 0) < 0)
// {
// messageList.AddString("文件发送失败" + WSAGetLastError());
// MessageBox("发送文件时失败");
// break;
// }
// memset(buffer, 0, BUFFER_SIZE);
// }
//
// fclose(fp);
// }
//
// messageList.AddString("文件发送成功");
// std::cout << "文件: " << real_name << std::endl << "发送成功 !" << std::endl;
// closesocket(client_socket);
// //释放 winsock 库
// WSACleanup();
//}
//class CFileTranslaterClientDlg : public CDialogEx
//{
//
//protected:
// HICON m_hIcon;
//
// // 生成的消息映射函数
// virtual BOOL OnInitDialog();
// afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
// afx_msg void OnPaint();
// BOOL connectSever(string ip, int port);
// BOOL SendFile(string filePath);
// afx_msg HCURSOR OnQueryDragIcon();
// DECLARE_MESSAGE_MAP()
//public:
// // 服务器IP地址
CIPAddressCtrl serverIP;
// afx_msg void OnBnClickedOk();
// afx_msg void OnBnClickedButton1();
// // 存放信息
// CListBox messageList;
// CIPAddressCtrl severIP;
// // 上传文件的名字
// CEdit UpLoadName;
// afx_msg void OnBnClickedButton2();
// afx_msg void OnBnClickedButton3();
// SOCKET client_socket = NULL;
// CString upload_file_location = NULL;
// CEdit download_path;
// CString download_file_location = NULL;
// CString store_file_location = NULL;
// afx_msg void OnBnClickedButton5();
// afx_msg void OnEnChangeEdit2();
// afx_msg void OnEnChangeEdit1();
// afx_msg void OnBnClickedButton4();
//
// //函数封装
// /*BOOL connectSever(string ip, int port);
// BOOL SendFile(string filePath);*/
//};
//
//
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <WinSock2.h>
#include <cassert>
#include <iostream>
#include <direct.h>
#include "process.h"
#include <string>
#include "KeHu.h"
using namespace std;
//#include <afx.h>
#define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32")
#ifdef WIN32
#include <shlobj.h>
#endif
//SOCKET InitNewSocket()
//{
// //声明地址结构
// sockaddr_in server_addr;
// server_addr.sin_family = AF_INET;
// server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
// server_addr.sin_port = htons(PORT);
//
// //初始化 socket dll
// WSADATA wsaData;
// WORD socketVersion = MAKEWORD(2, 2);
// assert(WSAStartup(socketVersion, &wsaData) == 0);
//
// //创建socket
// SOCKET m_socket = socket(AF_INET, SOCK_STREAM, 0);
// assert(SOCKET_ERROR != m_socket);
//
// //绑定
// assert(SOCKET_ERROR != bind(m_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)));
//
// //监听
// assert(SOCKET_ERROR != listen(m_socket, 5));
//
// return m_socket;
//}
//连接服务器
//void CFileTranslaterClientDlg::connectSever(string ip, int port)
//{
// //初始化 socket dll
// WSADATA wsaData;
// WORD socketVersion = MAKEWORD(2, 2);
// assert(WSAStartup(socketVersion, &wsaData) == 0);
//
// //创建socket
// client_socket = socket(AF_INET, SOCK_STREAM, 0);
// assert(SOCKET_ERROR != client_socket);
//
// //指定服务端的地址
// sockaddr_in server_addr;
// server_addr.sin_family = AF_INET;
// //CString SERVER_IP;
//
// //severIP.GetWindowTextA(SERVER_IP);
//
// server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
// server_addr.sin_port = htons(port);
// if (SOCKET_ERROR != connect(client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
// {
// cout<<"连接成功";
// }
// else
// {
// cout<<"连接失败";
// }
//}
void CFileTranslaterClientDlg::OnBnClickedButton1()
{
//初始化 socket dll
WSADATA wsaData;
WORD socketVersion = MAKEWORD(2, 2);
assert(WSAStartup(socketVersion, &wsaData) == 0);
//创建socket
client_socket = socket(AF_INET, SOCK_STREAM, 0);
assert(SOCKET_ERROR != client_socket);
//指定服务端的地址
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
//CString SERVER_IP;
//char SERVER_IP;
//severIP.GetWindowTextA(SERVER_IP);
char* ip;
ip = new char[100];
cout << "请输入IP地址" << endl;
cin >>ip;
//server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
server_addr.sin_addr.S_un.S_addr = inet_addr(ip);
server_addr.sin_port = htons(PORT);
if (SOCKET_ERROR != connect(client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
{
//messageList.AddString("连接成功");
cout << "连接成功";
}
else
{
//messageList.AddString("连接失败");
cout << "连接失败";
}
//string result = OnBnClickedButton1("127.0.0.1", 1982);
}
//文件的选择及路径的获取
void CFileTranslaterClientDlg::OnBnClickedButton2()
{
//BROWSEINFO bi;
//bi.hwndOwner = NULL;
//bi.pidlRoot = CSIDL_DESKTOP;//文件夹的根目录,此处为桌面
//bi.pszDisplayName = NULL;
//bi.lpszTitle = NULL;//显示位于对话框左上部的提示信息
//bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;//有新建文件夹按钮
//bi.lpfn = NULL;
//bi.iImage = 0;
//LPITEMIDLIST pidl = SHBrowseForFolder(&bi);//调用选择对话框
//if (pidl == NULL)
//{
// std::cout << "没有选择目录" << std::endl;
// return;
//}
//TCHAR strFolder[MAX_PATH];
//SHGetPathFromIDList(pidl, strFolder);
//std::string sFolder = StringUtil::WStringToString(strFolder);
}
void CFileTranslaterClientDlg::OnBnClickedButton3()
{
char* upload_file_location;
upload_file_location = new char[100];
//标识上传 send(client_socket,"1", sizeof("1"), 0);
char FileLocation[FILE_NAME_MAX_SIZE];
cin >> upload_file_location;
//char* upload_file_location =&upload_file_location1;
strcpy(FileLocation,upload_file_location);
//strcpy(FileLocation, "D:\\1.txt");
int file_Location_size = strlen(FileLocation);
while (FileLocation[file_Location_size] != '\\'&&file_Location_size > 0) { file_Location_size--; }
char real_name[FILE_NAME_MAX_SIZE];
::memset(real_name, 0, sizeof(real_name));
strcpy(real_name, FileLocation + file_Location_size + 1); //在这里存放真实名字
cout << "发送到服务器的真实名字:\t" << real_name << endl; //这个语句是用来测试的
//messageList.AddString(CString("要上传的文件是:") + CString(real_name)); //把名字显示在右边
cout << "要上传的文件是:" << real_name << endl;
char buffer[BUFFER_SIZE];
::memset(buffer, 0, BUFFER_SIZE);
if (send(client_socket, real_name, sizeof(real_name), 0) < 0) //标记
{
//messageList.AddString("在发送文件名字时出错" + WSAGetLastError());
//MessageBox("发送文件名时失败");
cout << "发送文件时失败";
}
//CString test;
FILE *fp = fopen(FileLocation, "rb"); //以只读,二进制的方式打开一个文件
if (NULL == fp)
{
//messageList.AddString("这个文件不存在");
cout << "这个文件不存在";
}
else
{
::memset(buffer, 0, BUFFER_SIZE);
int length = 0;
while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if (send(client_socket, buffer, length, 0) < 0)
{
//messageList.AddString("文件发送失败" + WSAGetLastError());
//MessageBox("发送文件时失败");
cout << "发送文件时失败";
break;
}
::memset(buffer, 0, BUFFER_SIZE);
}
fclose(fp);
}
//messageList.AddString("文件发送成功");
cout << "文件发送成功";
std::cout << "文件: " << real_name << std::endl << "发送成功 !" << std::endl;
closesocket(client_socket);
//释放 winsock 库
WSACleanup();
}
void CFileTranslaterClientDlg::OnBnClickedButton4()
{
//send(client_socket, "2", sizeof("2"), 0);标识下载
//这是从服务器上下载东西的代码
//输入文件名
char* download_file_location;
download_file_location = new char[100];
char file_name[FILE_NAME_MAX_SIZE + 1];
memset(file_name, 0, FILE_NAME_MAX_SIZE + 1);
std::cout << "输入你想要在服务器上获取的名字:" << std::endl; //测试
cin >> download_file_location;
strcpy(file_name, download_file_location);
//strcpy(file_name,"D:\\1.txt");
//messageList.AddString(CString("要下载的路径:") + download_file_location);
cout << "要下载的路径:" << download_file_location << endl;
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name)); //取较短的
//向服务器发送文件名
assert(send(client_socket, buffer, BUFFER_SIZE, 0) >= 0);//>=0
//打开文件,准备写入
//这里可以用filename代替
char* store_file_location;
store_file_location = new char[100];
char receive[FILE_NAME_MAX_SIZE];
cout << "你想放在哪里?" << endl;
cin >> store_file_location;
strcpy(receive, store_file_location);
//strcpy(receive, "E:\\");
int file_name_size = strlen(file_name);
while (file_name[file_name_size] != '\\'&&file_name_size > 0) { file_name_size--; }
char real_name[FILE_NAME_MAX_SIZE];
memset(real_name, 0, sizeof(real_name));
strcpy(real_name, file_name + file_name_size + 1);
strcat(receive, "\\");
cout << "接收到的真实名字" << real_name << endl;
strcat(receive, real_name);
FILE *fp = fopen(receive, "wb"); //以只写,二进制的方式打开一个文件wb
assert(NULL != fp);
memset(buffer, 0, BUFFER_SIZE);//初始化
int length = 0;
while ((length = recv(client_socket, buffer, BUFFER_SIZE, 0)) > 0)//>0
{
assert(fwrite(buffer, sizeof(char), length, fp) >= (size_t)length);
memset(buffer, 0, BUFFER_SIZE);
}
//messageList.AddString("下载成功");
cout << "下载成功";
std::cout << "接受文件 : " << file_name << endl << " 接收成功 !" << std::endl;
fclose(fp);
closesocket(client_socket);
}
int main()
{
CFileTranslaterClientDlg clg;
cout << "欢迎使用文件服务器" << endl
<< "连接服务器" << endl;
clg.OnBnClickedButton1();
cout << "******************" << endl;
cout<< "请选择服务器的工作模式(输入数字)" << endl
<< "--> 0.上传文件 " << endl
<< "--> 1.下载文件" << endl
<< "--> 2.关闭程序" << endl;
int choose = 0;
cin >> choose;
switch (choose)
{
case 0:
clg.OnBnClickedButton3();
break;
case 1:
clg.OnBnClickedButton4();
break;
case 2:
return 0;
default:
cout << "输入错误" << endl;
}
return 0;
}
1698

被折叠的 条评论
为什么被折叠?



