c++远程下载

来源:互联网 发布:普通增值税发票软件 编辑:程序博客网 时间:2024/06/06 07:25

首先建项目的时候,先选解决方案,然后再这个项目上添加项目(服务器项目和客户端项目)


服务端的程序为


#include<WinSock2.h>
#include<Windows.h>
#include<iostream>
using namespace std;


#pragma comment(lib,"ws2_32.lib")


const char *MESSAGECOMED = "收到客户端发来的消息:";
const char *ANSWER = "您的回复是:";
const char *WAITFORCLIENT = "等待客户机上线.......";




int main()
{
//1.要求你输入URL
//接收输入
//等待Client找到主机
//使用网络socket
//WSAStartup叫醒
//socket获取SOCKET
//拿到Client的端口和IP地址
//启动监听
//bind绑定
//开机
//看是否来电话
//来电话的时候就有对方的电话
//可以发送我们的URL
//发送给Client
//等待客户端的回应
//2.正在下载
//下载成功或失败


BOOL bSuccess = FALSE;
int nError = ERROR;//是否执行成功
SOCKET socketServ = INVALID_SOCKET;
SOCKET socketClient = INVALID_SOCKET;
do
{
WSADATA wsaData;//叫醒什么人
nError = WSAStartup(MAKEWORD(2, 2), &wsaData);//初始化
if (0 != nError)//看WSAStartup是不是叫醒了socket
break;//没叫醒,结束
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
break;


//创建Socket
socketServ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == socketServ)
break;//没有拿到可用的socket


//创建地址/电话号码
sockaddr_in addrServ = { 0 };
addrServ.sin_family = AF_INET;//IPV4
addrServ.sin_port = htons(10800);//端口号10800
addrServ.sin_addr.S_un.S_addr = INADDR_ANY;//所有IP


//绑定/装入手机
if (SOCKET_ERROR == bind(socketServ, (SOCKADDR*)&addrServ, sizeof(addrServ)))
break;


//开机
if (SOCKET_ERROR == listen(socketServ, SOMAXCONN))
break;


sockaddr_in addrClient = { 0 };//未知电话号码

int nAddrSize = sizeof(addrClient);


//等待客户连接
cout << WAITFORCLIENT << endl;
socketClient = accept(socketServ, (SOCKADDR*)&addrClient, &nAddrSize);
if (INVALID_SOCKET == socketClient)
break;

char szRecvMessage[MAXBYTE] = { 0 };
char szSendMessage[MAXBYTE] = { 0 };


//客户端上线
cout << "客户端上线" << endl;
while (true)
{
cout << "请输入下载地址:";
cin >> szSendMessage;
cout << endl;
if (strlen(szSendMessage) <= 0)
break;
//strcpy_s(szSendMessage, MAXBYTE, "http://dldir1.qq.com/music/clntupate/QQMusic_Setup_1152.exe");
if (SOCKET_ERROR == send(socketClient, szSendMessage, strlen(szSendMessage) + 1, 0))//发送指令
break;
if (SOCKET_ERROR == recv(socketClient, szRecvMessage, strlen(szSendMessage) + 1, 0))//接收结果
break;
cout << szRecvMessage << endl;
if (SOCKET_ERROR == recv(socketClient, szRecvMessage, strlen(szSendMessage) + 1, 0))
break;
cout << szRecvMessage << endl;
}


bSuccess = TRUE;
} while (false);


if (!bSuccess)
{
nError = WSAGetLastError();//获取错误信息
cout << "出现错误,错误信息" << nError << endl;
if (INVALID_SOCKET != socketServ)
closesocket(socketServ);
if (INVALID_SOCKET != socketClient)
closesocket(socketClient);
}
WSACleanup();
system("pause");
return 0;
}






客户端代码是


#include<WinSock2.h>
#include<Windows.h>
#include<iostream>


#include<Urlmon.h>
#pragma comment(lib,"Urlmon.lib")


using namespace std;


#pragma comment(lib,"ws2_32.lib")


const char *SERVERIPADDRESS = "192.168.0.110";
const char *DOWNLOADING = "正在下载...";
const char *DOWNLOADSUCESS = "文件下载成功!";
const char *FILEISDELETEED = "文件被删除!";
const char *URLISINCORRECT = "URL不正确!";
const char *DOWNLOADPATH = "D:\\qqmusic.exe";
BOOL CheckFileExist();




int main()
{
//连接服务器
//接收RUL
//开始下载
//通知服务器,下载结果


bool bSuccess = FALSE;
SOCKET socketClient = INVALID_SOCKET;//客户端的套接字
do
{
WSADATA wsaData;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))//叫醒
break;
//判断
if (2 != LOBYTE(wsaData.wVersion) ||
2 != HIBYTE(wsaData.wVersion))
break;


//拿手机
socketClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == socketClient)
break;


//拿到服务端电话号码
sockaddr_in addrServ = { 0 };
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(10800);//端口注意了
addrServ.sin_addr.S_un.S_addr = inet_addr(SERVERIPADDRESS);


//拨打号码
if (SOCKET_ERROR == connect(socketClient, (SOCKADDR*)&addrServ, sizeof(addrServ)))
break;


PROCESS_INFORMATION pi= { 0 };
STARTUPINFOA si = { 0 };
si.cb = sizeof(STARTUPINFO);
GetStartupInfoA(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = TRUE;


char szRecvMessage[MAXBYTE] = { 0 };
char szCmdLine[MAXBYTE] = { 0 };


while (true)
{
//接收指令
int nResult = recv(socketClient, szRecvMessage, MAXBYTE, 0);
if (nResult > 0)//成功接收到数据
{
if (strlen(szRecvMessage) > 0)
{
if (SOCKET_ERROR == send(socketClient, DOWNLOADING, strlen(DOWNLOADING) + 1, 0))
break;
HRESULT hr = URLDownloadToFileA/*下载*/(NULL, szRecvMessage, DOWNLOADPATH, 0, NULL);
if (hr == S_OK)
{
if (CheckFileExist())
{
if (SOCKET_ERROR == send(socketClient, DOWNLOADSUCESS, strlen(DOWNLOADSUCESS) + 1, 0))
break;
}
else
{
if (SOCKET_ERROR == send(socketClient, FILEISDELETEED, strlen(FILEISDELETEED) + 1, 0))
break;
}
}
else if (hr == INET_E_DOWNLOAD_FAILURE)
{
if (SOCKET_ERROR == send(socketClient, URLISINCORRECT, strlen(URLISINCORRECT) + 1, 0))
break;
}
else
{
if (SOCKET_ERROR == send(socketClient, URLISINCORRECT, strlen(URLISINCORRECT) + 1, 0))
break;
}
}
}
else if (nResult == 0)//连接被关闭
{
cout << "连接被关闭:" << endl;
break;
}
else
{
cout << "recv错误" << endl;
break;
}
}


bSuccess = TRUE;
} while (false);
if (!bSuccess)
{
int nError = WSAGetLastError();
cout << "出现错误,错误代码:" << nError << endl;
if (INVALID_SOCKET != socketClient)
closesocket(socketClient);
}


WSACleanup();
return 0;
}


BOOL CheckFileExist()
{
if (GetFileAttributesA(DOWNLOADPATH) == INVALID_FILE_ATTRIBUTES&&GetLastError() == ERROR_FILE_NOT_FOUND)
{
return FALSE;
}
else
{
return TRUE;
}
}







0 0
原创粉丝点击