TransferDlg.cpp
上传用户:jessejm
上传日期:2022-06-04
资源大小:1914k
文件大小:10k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // TransferDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Transfer.h"
  5. #include "TransferDlg.h"
  6. #include <afxtempl.h>
  7. #include "afxsock.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CAboutDlg dialog used for App About
  15. class CAboutDlg : public CDialog
  16. {
  17. public:
  18. CAboutDlg();
  19. // Dialog Data
  20. //{{AFX_DATA(CAboutDlg)
  21. enum { IDD = IDD_ABOUTBOX };
  22. //}}AFX_DATA
  23. // ClassWizard generated virtual function overrides
  24. //{{AFX_VIRTUAL(CAboutDlg)
  25. protected:
  26. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  27. //}}AFX_VIRTUAL
  28. // Implementation
  29. protected:
  30. //{{AFX_MSG(CAboutDlg)
  31. //}}AFX_MSG
  32. DECLARE_MESSAGE_MAP()
  33. };
  34. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  35. {
  36. //{{AFX_DATA_INIT(CAboutDlg)
  37. //}}AFX_DATA_INIT
  38. }
  39. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41. CDialog::DoDataExchange(pDX);
  42. //{{AFX_DATA_MAP(CAboutDlg)
  43. //}}AFX_DATA_MAP
  44. }
  45. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  46. //{{AFX_MSG_MAP(CAboutDlg)
  47. // No message handlers
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CTransferDlg dialog
  52. CTransferDlg::CTransferDlg(CWnd* pParent /*=NULL*/)
  53. : CDialog(CTransferDlg::IDD, pParent)
  54. {
  55. //{{AFX_DATA_INIT(CTransferDlg)
  56. // NOTE: the ClassWizard will add member initialization here
  57. //}}AFX_DATA_INIT
  58. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  59. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  60. }
  61. void CTransferDlg::DoDataExchange(CDataExchange* pDX)
  62. {
  63. CDialog::DoDataExchange(pDX);
  64. //{{AFX_DATA_MAP(CTransferDlg)
  65. // NOTE: the ClassWizard will add DDX and DDV calls here
  66. //}}AFX_DATA_MAP
  67. }
  68. BEGIN_MESSAGE_MAP(CTransferDlg, CDialog)
  69. //{{AFX_MSG_MAP(CTransferDlg)
  70. ON_WM_SYSCOMMAND()
  71. ON_WM_PAINT()
  72. ON_WM_QUERYDRAGICON()
  73. ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
  74. ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
  75. ON_BN_CLICKED(IDC_ADDSHAREFILE, OnAddsharefile)
  76. ON_BN_CLICKED(IDC_DELSHAREFILE, OnDelsharefile)
  77. ON_BN_CLICKED(IDC_DOWNLOADSHAREFILE, OnDownloadsharefile)
  78. ON_BN_CLICKED(IDC_SETNETWORK, OnSetnetwork)
  79. ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CTransferDlg message handlers
  84. BOOL CTransferDlg::OnInitDialog()
  85. {
  86. CDialog::OnInitDialog();
  87. // Add "About..." menu item to system menu.
  88. // IDM_ABOUTBOX must be in the system command range.
  89. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  90. ASSERT(IDM_ABOUTBOX < 0xF000);
  91. CMenu* pSysMenu = GetSystemMenu(FALSE);
  92. if (pSysMenu != NULL)
  93. {
  94. CString strAboutMenu;
  95. strAboutMenu.LoadString(IDS_ABOUTBOX);
  96. if (!strAboutMenu.IsEmpty())
  97. {
  98. pSysMenu->AppendMenu(MF_SEPARATOR);
  99. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  100. }
  101. }
  102. // Set the icon for this dialog.  The framework does this automatically
  103. //  when the application's main window is not a dialog
  104. SetIcon(m_hIcon, TRUE); // Set big icon
  105. SetIcon(m_hIcon, FALSE); // Set small icon
  106. // TODO: Add extra initialization here
  107. //其它状态初始化
  108. m_bClient=FALSE;
  109. m_bOnLine=FALSE;
  110. ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);
  111. ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->EnableWindow(FALSE);
  112. m_iPort=5000;
  113. SetDlgItemInt(IDC_PORT,m_iPort);
  114. //socket初始化
  115. if(AfxSocketInit(NULL)==FALSE)
  116. {
  117. AfxMessageBox("Socket Init Error");
  118. return FALSE;
  119. }
  120. //地址初始化
  121. char name[20];
  122. gethostname(name,20);
  123. hostent * host=gethostbyname(name);
  124. struct in_addr inAddr;
  125. memmove(&inAddr,host->h_addr_list[0],4);
  126. m_sIP=inet_ntoa(inAddr);
  127. ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->SetAddress(inAddr.S_un.S_un_b.s_b1,inAddr.S_un.S_un_b.s_b2,inAddr.S_un.S_un_b.s_b3,inAddr.S_un.S_un_b.s_b4);
  128. return TRUE;  // return TRUE  unless you set the focus to a control
  129. }
  130. void CTransferDlg::OnSysCommand(UINT nID, LPARAM lParam)
  131. {
  132. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  133. {
  134. CAboutDlg dlgAbout;
  135. dlgAbout.DoModal();
  136. }
  137. else
  138. {
  139. CDialog::OnSysCommand(nID, lParam);
  140. }
  141. }
  142. // If you add a minimize button to your dialog, you will need the code below
  143. //  to draw the icon.  For MFC applications using the document/view model,
  144. //  this is automatically done for you by the framework.
  145. void CTransferDlg::OnPaint() 
  146. {
  147. if (IsIconic())
  148. {
  149. CPaintDC dc(this); // device context for painting
  150. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  151. // Center icon in client rectangle
  152. int cxIcon = GetSystemMetrics(SM_CXICON);
  153. int cyIcon = GetSystemMetrics(SM_CYICON);
  154. CRect rect;
  155. GetClientRect(&rect);
  156. int x = (rect.Width() - cxIcon + 1) / 2;
  157. int y = (rect.Height() - cyIcon + 1) / 2;
  158. // Draw the icon
  159. dc.DrawIcon(x, y, m_hIcon);
  160. }
  161. else
  162. {
  163. CDialog::OnPaint();
  164. }
  165. }
  166. // The system calls this to obtain the cursor to display while the user drags
  167. //  the minimized window.
  168. HCURSOR CTransferDlg::OnQueryDragIcon()
  169. {
  170. return (HCURSOR) m_hIcon;
  171. }
  172. void CTransferDlg::OnRadio1() 
  173. {
  174. // TODO: Add your control notification handler code here
  175. m_bClient=FALSE;
  176. GetDlgItem(IDC_IPADDRESS)->EnableWindow(FALSE);
  177. }
  178. void CTransferDlg::OnRadio2() 
  179. {
  180. // TODO: Add your control notification handler code here
  181. m_bClient=TRUE;
  182. GetDlgItem(IDC_IPADDRESS)->EnableWindow(TRUE);
  183. }
  184. void CTransferDlg::OnAddsharefile() 
  185. {
  186. // TODO: Add your control notification handler code here
  187. CFileDialog filedlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files (*.*)|*.*||",NULL);
  188. filedlg.m_ofn.lpstrFile = new char[1024];
  189. filedlg.m_ofn.lpstrFile[0]='';
  190. filedlg.m_ofn.nMaxFile=1024;
  191. if(filedlg.DoModal()==IDOK)
  192. {
  193. m_LocalShareFiles.RemoveAll();
  194. CListBox *list=(CListBox *)GetDlgItem(IDC_LOCAL_FILE_LIST);
  195. list->ResetContent();
  196. POSITION pos=filedlg.GetStartPosition();
  197. int i=0;
  198. while(pos)
  199. {
  200. CString temp=filedlg.GetNextPathName(pos);
  201. m_LocalShareFiles.Add(temp);
  202. list->AddString(temp);
  203. }
  204. }
  205. delete[] filedlg.m_ofn.lpstrFile;
  206. }
  207. void CTransferDlg::OnDelsharefile() 
  208. {
  209. // TODO: Add your control notification handler code here
  210. CListBox *list=(CListBox *)GetDlgItem(IDC_LOCAL_FILE_LIST);
  211. int count=list->GetSelCount();
  212. CArray<int,int> selarray;
  213. selarray.SetSize(count);
  214. list->GetSelItems(count,selarray.GetData());
  215. for(int i=0;i<count;i++)
  216. {
  217. TRACE("%dn",selarray[i]);
  218. list->DeleteString(selarray[i]);
  219. }
  220. //-----刷行localfileshare
  221. count=list->GetCount();
  222. CMessg msg;
  223. msg.m_iCommand=0;
  224. m_LocalShareFiles.RemoveAll();
  225. for(i=0;i<count;i++)
  226. {
  227. CString temp;
  228. list->GetText(i,temp);
  229. m_LocalShareFiles.Add(temp);
  230. msg.m_strText+="!";
  231. msg.m_strText+=temp;
  232. }
  233. if(m_bOnLine)
  234. {
  235. m_TransferSocket.SendMessage(&msg);
  236. }
  237. }
  238. void CTransferDlg::OnDownloadsharefile() 
  239. {
  240. // TODO: Add your control notification handler code here
  241. if(!m_bOnLine)
  242. {
  243. AfxMessageBox("你没有连接到任何其它机器上!");
  244. return;
  245. }
  246. CListBox *list=(CListBox *)GetDlgItem(IDC_REMOTE_FILE_LIST);
  247. int count=list->GetSelCount();
  248. if(count==0)
  249. {
  250. AfxMessageBox("请选择需要下载的文件!");
  251. return;
  252. }
  253. m_NeedReceiveFiles.RemoveAll();
  254. CArray<int,int> selarray;
  255. selarray.SetSize(count);
  256. list->GetSelItems(count,selarray.GetData());
  257. CMessg msg;
  258. msg.m_iCommand=1;
  259. for(int i=0;i<count;i++)
  260. {
  261. CString temp;
  262. list->GetText(selarray[i],temp);
  263. m_NeedReceiveFiles.Add(temp);
  264. msg.m_strText+="!";
  265. msg.m_strText+=temp;
  266. }
  267. m_TransferSocket.SendMessage(&msg);
  268. }
  269. void CTransferDlg::HandleAccept()
  270. {
  271. if(m_ServerSocket.Accept(m_TransferSocket)==FALSE)
  272. {
  273. AfxMessageBox("Accept Error");
  274. return;
  275. }
  276. m_TransferSocket.Init(this);
  277. m_bOnLine=TRUE;
  278. CString name,temp;
  279. UINT port;
  280. m_TransferSocket.GetPeerName(name,port);
  281. temp.Format("%d",port);
  282. temp=name+":"+temp+"到访!";
  283. SetWindowText(LPCSTR(temp));
  284. //server先发送自己的共享文件名
  285. int count=m_LocalShareFiles.GetSize();
  286. CMessg msg;
  287. msg.m_iCommand=0;
  288. for(int i=0;i<count;i++)
  289. {
  290. msg.m_strText+="!";
  291. msg.m_strText+=m_LocalShareFiles[i];
  292. }
  293. // AfxMessageBox(msg.m_strText);
  294. m_TransferSocket.SendMessage(&msg);
  295. }
  296. void CTransferDlg::HandleClose()
  297. {
  298. m_bOnLine=FALSE;
  299. m_TransferSocket.CloseSocket();
  300. m_ServerSocket.Close();
  301. }
  302. void CTransferDlg::OnSetnetwork() 
  303. {
  304. // TODO: Add your control notification handler code here
  305. if(m_bClient==FALSE)
  306. {
  307. m_ServerSocket.Init(this);
  308. if(m_ServerSocket.Create(GetDlgItemInt(IDC_PORT))==FALSE)
  309. {
  310. AfxMessageBox("Socket Create Error");
  311. return;
  312. }
  313. if(m_ServerSocket.Listen()==FALSE)
  314. {
  315. AfxMessageBox("Socket Listen Error");
  316. return;
  317. }
  318. SetWindowText("正在监听连接!");
  319. }
  320. else
  321. {
  322. BYTE b[4];
  323. ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->GetAddress(b[0],b[1],b[2],b[3]);
  324. m_sIP.Format("%d.%d.%d.%d",b[0],b[1],b[2],b[3]);
  325. if(m_TransferSocket.Create()==FALSE)
  326. {
  327. AfxMessageBox("Socket Create Error");
  328. return;
  329. }
  330. if(m_TransferSocket.Connect(m_sIP,GetDlgItemInt(IDC_PORT))==FALSE)
  331. {
  332. AfxMessageBox("Socket Connect Error!!");
  333. m_TransferSocket.Close();
  334. return;
  335. }
  336. m_bOnLine=TRUE;
  337. m_TransferSocket.Init(this);
  338. SetWindowText("成功连接到服务器端!");
  339. int count=m_LocalShareFiles.GetSize();
  340. if(count==0)
  341. return;
  342. CMessg msg;
  343. msg.m_iCommand=0;
  344. for(int i=0;i<count;i++)
  345. {
  346. msg.m_strText+="!";
  347. msg.m_strText+=m_LocalShareFiles[i];
  348. }
  349. m_TransferSocket.SendMessage(&msg);
  350. }
  351. }
  352. void CTransferDlg::OnButton4() 
  353. {
  354. // TODO: Add your control notification handler code here
  355. m_TransferSocket.CloseSocket();
  356. m_ServerSocket.Close();
  357. m_bOnLine=FALSE;
  358. }