FtpClientDlg.cpp
上传用户:shjunxiao
上传日期:2022-01-25
资源大小:7105k
文件大小:8k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // FtpClientDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "FtpClient.h"
  5. #include "FtpClientDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. static int BUFSIZE = 2000;//文件分块的大小,以字节算
  14. typedef enum {FILEPACKET}PacketType;
  15. //文件分块的结构
  16. typedef struct{
  17. PacketType packetType;//块类型:文件块
  18. char szFileName[256];//文件名
  19. long nIndex;//文件块的序号
  20. long nCount;//文件分块的个数
  21. char content[2001];//存储单个文件块内容
  22. unsigned int length;//单个文件块内容的长度
  23. }DATA_PACKET;
  24. long GetFileLength(char *strPath)
  25. {//得到文件的长度,字节数
  26. long retLength;
  27.     FILE *stream;
  28. if( (stream  = fopen( strPath, "r" )) == NULL )
  29. return 0;
  30. fseek( stream, 0, SEEK_END);
  31. retLength=ftell( stream );
  32. fclose( stream );
  33. return retLength;
  34. }
  35. class CAboutDlg : public CDialog
  36. {
  37. public:
  38. CAboutDlg();
  39. // Dialog Data
  40. //{{AFX_DATA(CAboutDlg)
  41. enum { IDD = IDD_ABOUTBOX };
  42. //}}AFX_DATA
  43. // ClassWizard generated virtual function overrides
  44. //{{AFX_VIRTUAL(CAboutDlg)
  45. protected:
  46. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  47. //}}AFX_VIRTUAL
  48. // Implementation
  49. protected:
  50. //{{AFX_MSG(CAboutDlg)
  51. //}}AFX_MSG
  52. DECLARE_MESSAGE_MAP()
  53. };
  54. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  55. {
  56. //{{AFX_DATA_INIT(CAboutDlg)
  57. //}}AFX_DATA_INIT
  58. }
  59. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CAboutDlg)
  63. //}}AFX_DATA_MAP
  64. }
  65. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  66. //{{AFX_MSG_MAP(CAboutDlg)
  67. // No message handlers
  68. //}}AFX_MSG_MAP
  69. END_MESSAGE_MAP()
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CFtpClientDlg dialog
  72. CFtpClientDlg::CFtpClientDlg(CWnd* pParent /*=NULL*/)
  73. : CDialog(CFtpClientDlg::IDD, pParent)
  74. {
  75. //{{AFX_DATA_INIT(CFtpClientDlg)
  76. m_port = _T("8888");
  77. m_IP = _T("127.0.0.1");
  78. //}}AFX_DATA_INIT
  79. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  80. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  81. }
  82. void CFtpClientDlg::DoDataExchange(CDataExchange* pDX)
  83. {
  84. CDialog::DoDataExchange(pDX);
  85. //{{AFX_DATA_MAP(CFtpClientDlg)
  86. DDX_Control(pDX, IDC_PUT_FILE, m_put_file);
  87. DDX_Control(pDX, IDC_CONNECT, m_connect);
  88. DDX_Text(pDX, IDC_EDIT_PORT, m_port);
  89. DDX_Text(pDX, IDC_EDIT_IP, m_IP);
  90. //}}AFX_DATA_MAP
  91. }
  92. BEGIN_MESSAGE_MAP(CFtpClientDlg, CDialog)
  93. //{{AFX_MSG_MAP(CFtpClientDlg)
  94. ON_WM_SYSCOMMAND()
  95. ON_WM_PAINT()
  96. ON_WM_QUERYDRAGICON()
  97. ON_BN_CLICKED(IDC_CONNECT, OnConnect)
  98. ON_BN_CLICKED(IDC_PUT_FILE, OnPutFile)
  99. //}}AFX_MSG_MAP
  100. END_MESSAGE_MAP()
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CFtpClientDlg message handlers
  103. BOOL CFtpClientDlg::OnInitDialog()
  104. {
  105. CDialog::OnInitDialog();
  106. // Add "About..." menu item to system menu.
  107. // IDM_ABOUTBOX must be in the system command range.
  108. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  109. ASSERT(IDM_ABOUTBOX < 0xF000);
  110. CMenu* pSysMenu = GetSystemMenu(FALSE);
  111. if (pSysMenu != NULL)
  112. {
  113. CString strAboutMenu;
  114. strAboutMenu.LoadString(IDS_ABOUTBOX);
  115. if (!strAboutMenu.IsEmpty())
  116. {
  117. pSysMenu->AppendMenu(MF_SEPARATOR);
  118. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  119. }
  120. }
  121. // Set the icon for this dialog.  The framework does this automatically
  122. //  when the application's main window is not a dialog
  123. SetIcon(m_hIcon, TRUE); // Set big icon
  124. SetIcon(m_hIcon, FALSE); // Set small icon
  125. // TODO: Add extra initialization here
  126. return TRUE;  // return TRUE  unless you set the focus to a control
  127. }
  128. void CFtpClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
  129. {
  130. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  131. {
  132. CAboutDlg dlgAbout;
  133. dlgAbout.DoModal();
  134. }
  135. else
  136. {
  137. CDialog::OnSysCommand(nID, lParam);
  138. }
  139. }
  140. // If you add a minimize button to your dialog, you will need the code below
  141. //  to draw the icon.  For MFC applications using the document/view model,
  142. //  this is automatically done for you by the framework.
  143. void CFtpClientDlg::OnPaint() 
  144. {
  145. if (IsIconic())
  146. {
  147. CPaintDC dc(this); // device context for painting
  148. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  149. // Center icon in client rectangle
  150. int cxIcon = GetSystemMetrics(SM_CXICON);
  151. int cyIcon = GetSystemMetrics(SM_CYICON);
  152. CRect rect;
  153. GetClientRect(&rect);
  154. int x = (rect.Width() - cxIcon + 1) / 2;
  155. int y = (rect.Height() - cyIcon + 1) / 2;
  156. // Draw the icon
  157. dc.DrawIcon(x, y, m_hIcon);
  158. }
  159. else
  160. {
  161. CDialog::OnPaint();
  162. }
  163. }
  164. // The system calls this to obtain the cursor to display while the user drags
  165. //  the minimized window.
  166. HCURSOR CFtpClientDlg::OnQueryDragIcon()
  167. {
  168. return (HCURSOR) m_hIcon;
  169. }
  170. //连接到服务器的函数
  171. void CFtpClientDlg::OnConnect() 
  172. {
  173. // TODO: Add your control notification handler code here
  174. char buff[20];
  175. strcpy(buff,m_IP);
  176. //MessageBox(buff);
  177. //获取端口号的值
  178. int port = atoi(m_port);
  179. m_sock = socket(AF_INET,SOCK_STREAM ,0);
  180. if(INVALID_SOCKET  == m_sock)
  181. {
  182. return ;
  183. }
  184. SOCKADDR_IN srvAddr;
  185. srvAddr.sin_addr.S_un.S_addr = inet_addr(buff);
  186. srvAddr.sin_family = AF_INET;
  187.     srvAddr.sin_port = htons(port);
  188. if(connect(m_sock, (sockaddr*)&srvAddr, sizeof(srvAddr))== -1)
  189. {
  190. MessageBox("连接失败");
  191. return ;
  192. }
  193. else
  194. MessageBox("连接服务器成功");
  195. m_connect.EnableWindow(false);
  196. }
  197. //上传文件到服务器
  198. void CFtpClientDlg::OnPutFile() 
  199. {
  200. // TODO: Add your control notification handler code here
  201. CFileDialog  fileDlg(TRUE,NULL,NULL);
  202.     if(fileDlg.DoModal() == IDCANCEL)
  203. return;
  204. CString filePath;                   //文件路径
  205. filePath = fileDlg.GetPathName();
  206. char szFile[256] = { 0 };
  207. strcpy(szFile,filePath);
  208. char* pSend=new char[BUFSIZE];
  209. long fLength = GetFileLength(szFile);    //文件的字节数
  210. CRITICAL_SECTION CriticalSection;
  211. InitializeCriticalSection(&CriticalSection );//多线程要用到的互斥,同步的
  212. long segLength = fLength;//文件的字节数
  213. long sendFileLen = 0;
  214. FILE *file;
  215. if( (file  = fopen( szFile, "rb" )) == NULL )
  216. {
  217. MessageBox("faild to open file");
  218. return;
  219. }
  220. char szFileName[128] = { 0 };
  221. sprintf(szFileName, "%s", strrchr(szFile, '\'));
  222. strcpy(szFileName, szFileName+1);
  223. int nCount;//文件的分块总数
  224. if (fLength % BUFSIZE)//fLength为文件的字节数,BUFSIZE为每次文件分块的字节数
  225. {
  226. nCount = fLength / BUFSIZE + 1;
  227. }
  228. else
  229. {
  230. nCount = fLength / BUFSIZE;
  231. }
  232. int packIndex=1;//文件块的序号,也用来表示文件块传了多少了
  233. while(packIndex <= nCount)           // send file
  234. DATA_PACKET packSend;
  235. memset(&packSend, 0, sizeof(DATA_PACKET));//设定大小
  236. packSend.packetType = FILEPACKET ;//块的类型为文件块
  237. strcpy(packSend.szFileName, szFileName);
  238. packSend.nIndex = packIndex;
  239. packSend.nCount = nCount;
  240. memset(pSend, 0, BUFSIZE);
  241. fseek(file,(packIndex-1)*BUFSIZE,SEEK_SET);//将文件指针移到特定位置
  242. if( segLength < BUFSIZE )
  243. {
  244. fread( pSend, sizeof(char), segLength, file ); //从文件数据流中读取数据
  245. packSend.length = segLength;
  246. memcpy( packSend.content, pSend, segLength );
  247. send( m_sock,(char*)&packSend,sizeof(packSend),0 );//向服务器发送文件块信息
  248. break;
  249. }
  250. else
  251. {
  252. fread( pSend, sizeof(char), BUFSIZE, file );
  253. memcpy( packSend.content, pSend, BUFSIZE );
  254. packSend.length = BUFSIZE;
  255. send( m_sock,(char*)&packSend,sizeof(packSend),0 );//向服务器发送文件块信息
  256. char szRecv[128] = { 0 };
  257. while (true)
  258. {
  259. int nrecv = recv(m_sock, szRecv, 128,0);
  260. if (strcmp(szRecv, "RECV_END") == 0)
  261. {
  262. //MessageBox("recv ok!");
  263. break;
  264. }
  265. }
  266. }
  267. packIndex++;
  268. }
  269. //MessageBox("send end");
  270. fclose(file);
  271. delete []pSend;
  272. closesocket(m_sock);
  273. m_put_file.EnableWindow(false);
  274. return;
  275. }