FileTransferDlg.cpp
上传用户:onsales
上传日期:2010-01-31
资源大小:224k
文件大小:8k
源码类别:

网络编程

开发平台:

Visual C++

  1. // FileTransferDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "FileTransfer.h"
  5. #include "FileTransferDlg.h"
  6. #include "FileInfo.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. //}}AFX_DATA
  22. // ClassWizard generated virtual function overrides
  23. //{{AFX_VIRTUAL(CAboutDlg)
  24. protected:
  25. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. protected:
  29. //{{AFX_MSG(CAboutDlg)
  30. //}}AFX_MSG
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CAboutDlg)
  36. //}}AFX_DATA_INIT
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. //{{AFX_DATA_MAP(CAboutDlg)
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  45. //{{AFX_MSG_MAP(CAboutDlg)
  46. // No message handlers
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CFileTransferDlg dialog
  51. CFileTransferDlg::CFileTransferDlg(CWnd* pParent /*=NULL*/)
  52. : CDialog(CFileTransferDlg::IDD, pParent)
  53. {
  54. //{{AFX_DATA_INIT(CFileTransferDlg)
  55. m_FileName = _T("");
  56. m_FileSize = _T("");
  57. m_Name = _T("");
  58. //}}AFX_DATA_INIT
  59. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  60. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  61. }
  62. void CFileTransferDlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CFileTransferDlg)
  66. DDX_Control(pDX, IDOK, m_Button);
  67. DDX_Control(pDX, IDC_PROGRESS, m_Progress);
  68. DDX_Control(pDX, IDC_IPADDRESS, m_IPADDRESS);
  69. DDX_Text(pDX, IDC_FILENAME, m_FileName);
  70. DDX_Text(pDX, IDC_FILESIZE, m_FileSize);
  71. DDX_Text(pDX, IDC_NAME, m_Name);
  72. //}}AFX_DATA_MAP
  73. }
  74. BEGIN_MESSAGE_MAP(CFileTransferDlg, CDialog)
  75. //{{AFX_MSG_MAP(CFileTransferDlg)
  76. ON_WM_SYSCOMMAND()
  77. ON_WM_PAINT()
  78. ON_WM_QUERYDRAGICON()
  79. //}}AFX_MSG_MAP
  80. END_MESSAGE_MAP()
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CFileTransferDlg message handlers
  83. BOOL CFileTransferDlg::OnInitDialog()
  84. {
  85. CDialog::OnInitDialog();
  86. // Add "About..." menu item to system menu.
  87. // IDM_ABOUTBOX must be in the system command range.
  88. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  89. ASSERT(IDM_ABOUTBOX < 0xF000);
  90. CMenu* pSysMenu = GetSystemMenu(FALSE);
  91. if (pSysMenu != NULL)
  92. {
  93. CString strAboutMenu;
  94. strAboutMenu.LoadString(IDS_ABOUTBOX);
  95. if (!strAboutMenu.IsEmpty())
  96. {
  97. pSysMenu->AppendMenu(MF_SEPARATOR);
  98. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  99. }
  100. }
  101. // Set the icon for this dialog.  The framework does this automatically
  102. //  when the application's main window is not a dialog
  103. SetIcon(m_hIcon, TRUE); // Set big icon
  104. SetIcon(m_hIcon, FALSE); // Set small icon
  105. CFile mfile;
  106. mfile.Open("file.txt",CFile::modeRead);
  107.     int filelong=0;
  108. filelong=mfile.GetLength();
  109. char pbuf[1000];
  110. mfile.Read( pbuf, sizeof( pbuf ) ); 
  111. //if(filelong<256) 
  112. mfile.Close();
  113. pbuf[filelong]='';
  114. IPstr="";
  115. m_Name="";
  116. int i=2;
  117. while(pbuf[i]!='#')
  118. {
  119. IPstr+=pbuf[i];
  120. i++;
  121. }
  122. i++;
  123. while(pbuf[i]!='#')
  124. {
  125. m_Name+=pbuf[i];
  126. i++;
  127. }
  128. if(pbuf[0]=='4')//说明作为服务器传送文件
  129. {
  130. sign=1;
  131. m_Button.SetWindowText("传送文件");
  132. }
  133. else {
  134. sign=0;
  135. m_Button.SetWindowText("接收文件");
  136. }
  137. // TODO: Add extra initialization here
  138. m_IPADDRESS.SetWindowText(IPstr);
  139. this->UpdateData(FALSE);
  140. return TRUE;  // return TRUE  unless you set the focus to a control
  141. }
  142. void CFileTransferDlg::OnSysCommand(UINT nID, LPARAM lParam)
  143. {
  144. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  145. {
  146. CAboutDlg dlgAbout;
  147. dlgAbout.DoModal();
  148. }
  149. else
  150. {
  151. CDialog::OnSysCommand(nID, lParam);
  152. }
  153. }
  154. // If you add a minimize button to your dialog, you will need the code below
  155. //  to draw the icon.  For MFC applications using the document/view model,
  156. //  this is automatically done for you by the framework.
  157. void CFileTransferDlg::OnPaint() 
  158. {
  159. if (IsIconic())
  160. {
  161. CPaintDC dc(this); // device context for painting
  162. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  163. // Center icon in client rectangle
  164. int cxIcon = GetSystemMetrics(SM_CXICON);
  165. int cyIcon = GetSystemMetrics(SM_CYICON);
  166. CRect rect;
  167. GetClientRect(&rect);
  168. int x = (rect.Width() - cxIcon + 1) / 2;
  169. int y = (rect.Height() - cyIcon + 1) / 2;
  170. // Draw the icon
  171. dc.DrawIcon(x, y, m_hIcon);
  172. }
  173. else
  174. {
  175. CDialog::OnPaint();
  176. }
  177. }
  178. // The system calls this to obtain the cursor to display while the user drags
  179. //  the minimized window.
  180. HCURSOR CFileTransferDlg::OnQueryDragIcon()
  181. {
  182. return (HCURSOR) m_hIcon;
  183. }
  184. void CFileTransferDlg::OnOK() 
  185. {
  186. // TODO: Add extra validation here
  187. if(sign==1)this->OnServer();
  188. else this->OnClient();
  189. CDialog::OnOK();
  190. }
  191. void CFileTransferDlg::OnServer()
  192. {
  193. CFileDialog Dlg(TRUE);
  194. if(Dlg.DoModal()!=IDOK)
  195. CDialog::OnOK();
  196. if(!MyFile.Open(Dlg.GetPathName(), CFile::modeRead | CFile::typeBinary))
  197. {
  198. MessageBox("文件不存在!",MB_OK);
  199. CDialog::OnOK();
  200. }
  201. m_FileName=MyFile.GetFileName();
  202. m_FileSize.Format("%dbytes",MyFile.GetLength());
  203. UpdateData(FALSE);
  204. CSocket sockSrvr;
  205. sockSrvr.Create(800);
  206. sockSrvr.Listen();
  207. CSocket sockRecv;
  208. sockSrvr.Accept(sockRecv);
  209. SOCKET_STREAM_FILE_INFO StreamFileInfo;
  210. WIN32_FIND_DATA             FindFileData;
  211. FindClose(FindFirstFile(Dlg.GetPathName(),&FindFileData));
  212.     memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
  213.     strcpy(StreamFileInfo.szFileTitle,MyFile.GetFileTitle());
  214.     StreamFileInfo.dwFileAttributes     =       FindFileData.dwFileAttributes;
  215.     StreamFileInfo.ftCreationTime       =       FindFileData.ftCreationTime;
  216.     StreamFileInfo.ftLastAccessTime     =       FindFileData.ftLastAccessTime;
  217.     StreamFileInfo.ftLastWriteTime      =       FindFileData.ftLastWriteTime;
  218.     StreamFileInfo.nFileSizeHigh        =       FindFileData.nFileSizeHigh;
  219.     StreamFileInfo.nFileSizeLow         =       FindFileData.nFileSizeLow;
  220. sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
  221. int total=0;
  222. int range=(int)StreamFileInfo.nFileSizeLow;
  223. m_Progress.SetRange(0,range);
  224. UINT dwRead=0;
  225. while(dwRead<StreamFileInfo.nFileSizeLow)
  226. {
  227. byte* data = new byte[1024];
  228. UINT dw=MyFile.Read(data, 1024);
  229. sockRecv.Send(data, dw);
  230. total+=sizeof(data);
  231. m_Progress.SetPos(total);
  232. dwRead+=dw;
  233. }
  234. MyFile.Close();
  235. sockRecv.Close();
  236. AfxMessageBox("发送完毕!");
  237. }
  238. void CFileTransferDlg::OnClient()
  239. {
  240. AfxSocketInit(NULL);
  241. CSocket sockClient;
  242. sockClient.Create();
  243. CString szIP;
  244. szIP=IPstr;
  245. if(!sockClient.Connect((LPCTSTR)szIP, 800))
  246. {
  247. AfxMessageBox("连接到对方机器失败!");
  248. return;
  249. }
  250. SOCKET_STREAM_FILE_INFO StreamFileInfo;
  251. sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
  252. m_FileName=StreamFileInfo.szFileTitle;
  253. m_FileSize.Format("%dbytes",StreamFileInfo.nFileSizeLow);
  254. UpdateData(FALSE);
  255. CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
  256. UINT dwRead = 0;
  257. int total=0;
  258. int range=(int)StreamFileInfo.nFileSizeLow;
  259. m_Progress.SetRange(0,range);
  260. while(dwRead<StreamFileInfo.nFileSizeLow)
  261. {
  262. byte* data = new byte[1024];
  263. memset(data,0,1024);
  264. UINT dw=sockClient.Receive(data, 1024);
  265. destFile.Write(data, dw);
  266. total+=sizeof(data);
  267. m_Progress.SetPos(total);
  268. dwRead+=dw;
  269. }
  270. SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
  271.                 &StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
  272. destFile.Close();
  273. SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
  274. sockClient.Close();
  275. AfxMessageBox("接收完毕!");
  276. }