c++使用socket实现C/S端文件的下载传输(二)

2014-11-24 12:03:59 · 作者: · 浏览: 3
InitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

m_progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
m_progress->SetPos(0);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

客户端具体实现部分:

void CRecvFileClientDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
ConnectServer();

}


BOOL CRecvFileClientDlg::InitSocket()
{
//加载套接字库 www.2cto.com
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return FALSE;
}

if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return FALSE;
}

return TRUE;

}

void CRecvFileClientDlg::ConnectRecvFileData(DWORD ip,int port)
{

unsigned long long file_size=0;
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(ip);
addrSrv.sin_port=ntohs(port);
addrSrv.sin_family = AF_INET;
//connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//recv(sockClient,(char*)&file_size,sizeof(unsigned long long)+1,NULL);

if (!connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
GetDlgItem(IDC_SHOWINFO)->SetWindowText(_T(""));
GetDlgItem(IDC_SHOWINFO)->SetWindowText(_T("连接服务器成功!\r\n"));

recv(sockClient,(char*)&file_size,sizeof(unsigned long long)+1,NULL);

unsigned short maxvalue = file_size; //此处不太稳妥 当数据很大时可能会出现异常
m_progress->SetRange(0,maxvalue);

if (file_size>0)
{
GetDlgItem(IDC_SHOWINFO)->SetWindowText(_T(""));
GetDlgItem(IDC_SHOWINFO)->SetWindowText(_T("文件下载到本地 d:\\test.zip \r\n"));

DWORD dwNumberOfBytesRecv=0;
DWORD dwCountOfBytesRecv=0;
char Buffer[1024];
CString filename = _T("d:\\test.zip");
HANDLE hFile;
hFile = CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

do
{
m_progress->SetPos(dwCountOfBytesRecv);//更新进度条

dwNumberOfBytesRecv = ::recv(sockClient,Buffer,sizeof(Buffer),0);
::WriteFile(hFile,Buffer,dwNumberOfBytesRecv,&dwNumberOfBytesRecv,NULL);
dwCountOfBytesRecv += dwNumberOfBytesRecv;
} while (file_size - dwCountOfBytesRecv);


CloseHandle(hFile);

GetDlgItem(IDC_SHOWINFO)->SetWindowText(_T(""));
GetDlgItem(IDC_SHOWINFO)->SetWindowText(_T("文件接收完毕!\r\n"));
AfxMessageBox(_T("文件接收完毕!"));//醒目可以