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

P2P编程

开发平台:

Visual C++

  1. // TransferSocket.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Transfer.h"
  5. #include "TransferSocket.h"
  6. #include "TransferDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTransferSocket
  14. CTransferSocket::CTransferSocket()
  15. {
  16. m_aSessionIn=NULL;
  17. m_aSessionOut=NULL;
  18. m_sfSocketFile=NULL;
  19. m_bInit=false;
  20. m_bClose=false;
  21. }
  22. CTransferSocket::~CTransferSocket()
  23. {
  24. if(m_aSessionIn)
  25. delete m_aSessionIn;
  26. if(m_aSessionOut)
  27. delete m_aSessionOut;
  28. if(m_sfSocketFile)
  29. delete m_sfSocketFile;
  30. }
  31. // Do not edit the following lines, which are needed by ClassWizard.
  32. #if 0
  33. BEGIN_MESSAGE_MAP(CTransferSocket, CSocket)
  34. //{{AFX_MSG_MAP(CTransferSocket)
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. #endif // 0
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CTransferSocket member functions
  40. void CTransferSocket::OnReceive(int nErrorCode) 
  41. {
  42. // TODO: Add your specialized code here and/or call the base class
  43. CMessg msg;
  44. msg.Serialize(*m_aSessionIn);
  45. if(msg.m_iCommand==0)
  46. {
  47. m_dlg->m_RemoteShareFiles.RemoveAll();
  48. CListBox* list=(CListBox*)(m_dlg->GetDlgItem(IDC_REMOTE_FILE_LIST));
  49. list->ResetContent();
  50. CString temp,name;
  51. int i;
  52. temp=msg.m_strText;
  53. TRACE("%sn",msg.m_strText);
  54. temp.TrimLeft("!");//!
  55. while((i=temp.Find("!"))!=-1)
  56. {
  57. name=temp.Left(i);
  58. TRACE("%sn",name);
  59. TRACE("%sn",temp);
  60. temp=temp.Mid(name.GetLength()+1);
  61. m_dlg->m_RemoteShareFiles.Add(name);
  62. list->AddString(name);
  63. }
  64. m_dlg->m_RemoteShareFiles.Add(temp);
  65. list->AddString(temp);
  66. return;
  67. }
  68. if(msg.m_iCommand==1)
  69. {
  70. CString temp,name;
  71. int i;
  72. temp=msg.m_strText;
  73. temp.TrimLeft("!");//!
  74. while((i=temp.Find("!"))!=-1)
  75. {
  76. name=temp.Left(i);
  77. temp=temp.Mid(name.GetLength()+1);
  78. m_dlg->m_NeedTransferFiles.Add(name);
  79. }
  80. m_dlg->m_NeedTransferFiles.Add(temp);
  81. m_dlg->SetWindowText("需要传输的文件名称处理完毕!");
  82. for(i=0;i<m_dlg->m_NeedTransferFiles.GetSize();i++)
  83. {
  84. CMessg m;
  85. TRACE("%sn",m_dlg->m_NeedTransferFiles[i]);
  86. CFile file(m_dlg->m_NeedTransferFiles[i],CFile::modeRead|CFile::shareDenyWrite);
  87. m_dlg->SetWindowText("正在传输"+m_dlg->m_NeedTransferFiles[i]);
  88. byte *buffer=NULL;
  89. long count=file.GetLength();
  90. buffer= new byte[count];
  91. file.Read(buffer,count);
  92. m.m_iCommand=2;
  93. m.m_strText=buffer;
  94. m_dlg->m_TransferSocket.SendMessage(&m);
  95. m_dlg->SetWindowText(m_dlg->m_NeedTransferFiles[i]+"传输完毕!");
  96. file.Close();
  97. }
  98. m_dlg->m_NeedTransferFiles.RemoveAll();
  99. return;
  100. }
  101. //接收文件
  102. if(msg.m_iCommand==2)
  103. {
  104. int k=m_dlg->m_NeedReceiveFiles[0].ReverseFind('\');
  105. CString tt;
  106. tt=m_dlg->m_NeedReceiveFiles[0].Mid(k+1);
  107. tt="E:\"+tt;
  108. if(m_file.Open(tt,CFile::modeWrite|CFile::modeCreate)==FALSE)
  109. {
  110. AfxMessageBox("Failed to open the file!");
  111. m_file.Close();
  112. }
  113. m_file.Write(msg.m_strText,msg.m_strText.GetLength());
  114. m_file.Close();
  115. AfxMessageBox(m_dlg->m_NeedReceiveFiles[0]+"下载完毕!");
  116. return;
  117. }
  118. CSocket::OnReceive(nErrorCode);
  119. }
  120. void CTransferSocket::OnClose(int nErrorCode) 
  121. {
  122. // TODO: Add your specialized code here and/or call the base class
  123. m_bClose=true;
  124. CloseSocket();
  125. // m_dlg->CloseSessionSocket();
  126. CSocket::OnClose(nErrorCode);
  127. }
  128. void CTransferSocket::Init(CTransferDlg * dlg)
  129. {
  130. m_sfSocketFile= new CSocketFile(this);
  131. m_aSessionIn=new CArchive(m_sfSocketFile,CArchive::load);
  132. m_aSessionOut=new CArchive(m_sfSocketFile,CArchive::store);
  133. m_bClose=false;
  134. this->m_dlg=dlg;
  135. }
  136. BOOL CTransferSocket::SendMessage(CMessg * msg)
  137. {
  138. if (m_aSessionOut != NULL)
  139. {
  140. msg->Serialize(*m_aSessionOut);
  141. m_aSessionOut->Flush();
  142. return TRUE;
  143. }
  144. else
  145. {
  146. //对方关闭了连接
  147. m_bClose=true;
  148. CloseSocket();
  149. // m_dlg->CloseSessionSocket();
  150. return FALSE;
  151. }
  152. }
  153. void CTransferSocket::CloseSocket()
  154. {
  155. if(m_aSessionIn)
  156. {
  157. delete m_aSessionIn;
  158. m_aSessionIn=NULL;
  159. }
  160. if(m_aSessionOut)
  161. {
  162. delete m_aSessionOut;
  163. m_aSessionOut=NULL;
  164. }
  165. if(m_sfSocketFile)
  166. {
  167. delete m_aSessionOut;
  168. m_sfSocketFile=NULL;
  169. }
  170. Close();
  171. m_bInit=false;
  172. m_bClose=true;
  173. }