要实现文件传输最简单的办法是写两个线程,一个服务器段的发送处理线程,一个客户端的接收处理线程。 线程处理函数需要声明为类的静态成员,由于不可访问类内部的数据成员,所以参数传递里面最好有个类的指针 服务器段的发送处理线程:
CFileTransferDlg* pDlg = (CFileTransferDlg*)lpParam; CFileDialog fileDlg(TRUE); fileDlg.m_ofn.lpstrTitle = "打开文件对话框"; fileDlg.m_ofn.lpstrFilter = "所有文件(*.*) /0 *.*/0";
if(IDOK == fileDlg.DoModal()) { CFile fileOpen; if(!fileOpen.Open(fileDlg.GetPathName(), CFile::modeRead | CFile::typeBinary)) { AfxMessageBox("无法打开文件", MB_OK | MB_ICONERROR); return 0; }
CSocket sockSrvr; sockSrvr.Create(800); //端口号 sockSrvr.Listen(); //开始监听 CSocket sockRecv; sockSrvr.Accept(sockRecv);
char strSend[19]; strcpy(strSend, "now begin transfer"); //此处用Send向所有网络资源发送数据,如果用SendTo则需要指定ip sockRecv.Send(&strSend,sizeof(strSend)); //发送连接请求
//strExt存放文件后缀名 char* strExt = new char[5]; strcpy(strExt, fileDlg.GetFileExt()); int length = strlen(strExt); //先发送数据的长度,再发送数据本身 sockRecv.Send(&length, 4); sockRecv.Send(strExt, length);
UINT dwRead = 1; while(dwRead) { //一次发送1kb byte* data = new byte[1024]; dwRead = fileOpen.Read(data, 1024); sockRecv.Send(data, dwRead); } fileOpen.Close(); sockRecv.Close(); AfxMessageBox("发送完成!"); } return 1; 客户端接收文件线程处理函数: //参数lpParam存放窗口指针 CFileTransferDlg* pDlg = (CFileTransferDlg*)lpParam; DWORD dwIP;
//获取ip空间的ip地址 ((CIPAddressCtrl*)pDlg->GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
//将dword ip转换为CString unsigned char* pIP; pIP = (unsigned char*)&dwIP; CString strIP; strIP.Format("%u.%u.%u.%u",*(pIP+3), *(pIP+2), *(pIP+1), *pIP);
CSocket sockClient; sockClient.Create(); //连接 while(!sockClient.Connect(strIP, 800)) Sleep(50);
char strRecv[19]; //判断接收到的数据是否为传输文件请求 while(strcmp(strRecv, "now begin transfer")) { sockClient.Receive(strRecv, 19); }
CFileDialog fileDlg(FALSE); if(IDOK == fileDlg.DoModal()) { fileDlg.m_ofn.lpstrTitle = "保存文件对话框"; int length; char strExt[5];
//先接收数据长度,再接收数据本身 sockClient.Receive(&length, 4); sockClient.Receive(strExt, length); //strExt为文件后缀名 CFile destFile(fileDlg.GetPathName() + "." + strExt, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); UINT dwRead = 1;
//写入新创建的文件 while(dwRead) { byte* data = new byte[1024]; memset(data,0,1024); dwRead = sockClient.Receive(data, 1024); destFile.Write(data, dwRead); } destFile.Close(); sockClient.Close(); AfxMessageBox("接收完毕!"); } return 1;
|
VC文件传输
最新推荐文章于 2024-08-10 20:26:55 发布
vc 文件传输的实现
2008-07-20 20:33