1
0

Server.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. // Server.cpp: implementation of the CServer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "cp_main.h"
  6. #include "Server.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. UINT MTServerThread(LPVOID pParam)
  16. {
  17. LogSendRecieveInfo("Start of ServerThread");
  18. WSADATA wsaData;
  19. sockaddr_in local;
  20. int wsaret = WSAStartup(0x101,&wsaData);
  21. if(wsaret!=0)
  22. {
  23. LogSendRecieveInfo("ERROR - int wsaret = WSAStartup(0x101,&wsaData);");
  24. return 0;
  25. }
  26. local.sin_family = AF_INET;
  27. local.sin_addr.s_addr = INADDR_ANY;
  28. local.sin_port = htons((u_short)20248);
  29. theApp.m_sSocket = socket(AF_INET, SOCK_STREAM, 0);
  30. if(theApp.m_sSocket == INVALID_SOCKET)
  31. {
  32. LogSendRecieveInfo("ERROR - theApp.m_sSocket = socket(AF_INET, SOCK_STREAM, 0);");
  33. return 0;
  34. }
  35. if(bind(theApp.m_sSocket,(sockaddr*)&local,sizeof(local))!=0)
  36. {
  37. LogSendRecieveInfo("ERROR - if(bind(theApp.m_sSocket,(sockaddr*)&local,sizeof(local))!=0)");
  38. return 0;
  39. }
  40. if(listen(theApp.m_sSocket,10)!=0)
  41. {
  42. LogSendRecieveInfo("ERROR - if(listen(theApp.m_sSocket,10)!=0)");
  43. return 0;
  44. }
  45. SOCKET socket;
  46. sockaddr_in from;
  47. int fromlen = sizeof(from);
  48. while(true)
  49. {
  50. if(theApp.m_bAppExiting)
  51. break;
  52. socket = accept(theApp.m_sSocket, (struct sockaddr*)&from,&fromlen);
  53. AfxBeginThread(ClientThread,(LPVOID)socket);
  54. }
  55. LogSendRecieveInfo("End of Server Thread");
  56. return 0;
  57. }
  58. BOOL Recv(SOCKET sock, SendInfo *pInfo)
  59. {
  60. long lReceiveCount = 0;
  61. long lWanted = sizeof(SendInfo);
  62. long lOffset = 0;
  63. while(lWanted > 0)
  64. {
  65. lReceiveCount = recv(sock, ((char*)pInfo) + lOffset, lWanted, 0);
  66. if(lReceiveCount == SOCKET_ERROR)
  67. {
  68. LogSendRecieveInfo("********ERROR if(lReceiveCount == SOCKET_ERROR)*******");
  69. return FALSE;
  70. }
  71. else if(lReceiveCount == 0)
  72. {
  73. LogSendRecieveInfo("********ERROR lRecieveCount == 0");
  74. return FALSE;
  75. }
  76. LogSendRecieveInfo(StrF("------Bytes Read %d Total Recieved %d", lReceiveCount, lOffset));
  77. lWanted -= lReceiveCount;
  78. lOffset += lReceiveCount;
  79. }
  80. if(pInfo->m_nSize != lWanted)
  81. {
  82. LogSendRecieveInfo(StrF("------ERROR Incoming struct size %d Expected Size %d", pInfo->m_nSize, lWanted));
  83. return FALSE;
  84. }
  85. return TRUE;
  86. }
  87. UINT ClientThread(LPVOID pParam)
  88. {
  89. LogSendRecieveInfo("*********************Start of ClientThread*********************");
  90. SOCKET socket = (SOCKET)pParam;
  91. CClipList *pClipList = NULL;
  92. CClip *pClip = NULL;
  93. CClipFormat cf;
  94. SendInfo info;
  95. int nRecvReturn = 0;
  96. long lBytesCopied;
  97. bool bBreak = false;
  98. BYTE *pByte = NULL;
  99. long lByteSize = 0;
  100. BOOL bSetToClipBoard = FALSE;
  101. while(true)
  102. {
  103. if(Recv(socket, &info) == FALSE)
  104. break;
  105. switch(info.m_Type)
  106. {
  107. case MyEnums::START:
  108. {
  109. if(pClip != NULL)
  110. {
  111. delete pClip;
  112. pClip = NULL;
  113. }
  114. pClip = new CClip;
  115. CString cs;
  116. cs.Format("%s\n(%s)(%s)", info.m_cText, info.m_cComputerName, info.m_cIP);
  117. if(pClip)
  118. {
  119. pClip->m_Desc = cs;
  120. }
  121. bSetToClipBoard = FALSE;
  122. if(g_Opt.m_csIPListToPutOnClipboard.Find(info.m_cIP) >= 0)
  123. bSetToClipBoard = TRUE;
  124. if(g_Opt.m_csIPListToPutOnClipboard.Find(info.m_cComputerName) >= 0)
  125. bSetToClipBoard = TRUE;
  126. info.m_cText[20] = 0;
  127. LogSendRecieveInfo(StrF("::START %s %s %s", info.m_cText, info.m_cComputerName, info.m_cIP));
  128. }
  129. break;
  130. case MyEnums::DATA_START:
  131. {
  132. if(pByte != NULL)
  133. {
  134. delete pByte;
  135. pByte = NULL;
  136. }
  137. lByteSize = info.m_lParameter1;
  138. pByte = new BYTE[info.m_lParameter1];
  139. cf.m_cfType = GetFormatID(info.m_cText);
  140. lBytesCopied = 0;
  141. if(pClip)
  142. pClip->m_lTotalCopySize += info.m_lParameter1;
  143. LogSendRecieveInfo(StrF("::DATA_START Total Size = %d type = %s", lByteSize, info.m_cText));
  144. }
  145. break;
  146. case MyEnums::DATA:
  147. {
  148. memcpy(((char*)pByte) + lBytesCopied, info.m_cText, info.m_lParameter1);
  149. lBytesCopied += info.m_lParameter1;
  150. LogSendRecieveInfo(StrF("::DATA Copy Bytes = %d TotalCopy = %d", info.m_lParameter1, lBytesCopied));
  151. }
  152. break;
  153. case MyEnums::DATA_END:
  154. {
  155. if(pByte)
  156. {
  157. cf.m_hgData = NewGlobalP(pByte, lByteSize);
  158. if(pClip)
  159. {
  160. pClip->m_Formats.Add(cf);
  161. cf.m_hgData = 0; // now owned by pClip
  162. }
  163. delete pByte;
  164. pByte = NULL;
  165. }
  166. else
  167. LogSendRecieveInfo("::ERROR pByte was null");
  168. LogSendRecieveInfo("::DATA_END");
  169. }
  170. break;
  171. case MyEnums::END:
  172. {
  173. if(pClipList == NULL)
  174. pClipList = new CClipList;
  175. if(pClipList)
  176. {
  177. pClipList->AddTail(pClip);
  178. pClip = NULL;
  179. }
  180. else
  181. LogSendRecieveInfo("::ERROR pClipList was NULL");
  182. LogSendRecieveInfo("::END");
  183. }
  184. break;
  185. case MyEnums::EXIT:
  186. {
  187. if(pClipList && pClipList->GetCount() > 0)
  188. {
  189. //Post a message pClipList will be freed by the reciever
  190. ::PostMessage(theApp.m_MainhWnd, WM_ADD_TO_DATABASE_FROM_SOCKET, (WPARAM)pClipList, bSetToClipBoard);
  191. pClipList = NULL;
  192. }
  193. else
  194. LogSendRecieveInfo("::ERROR pClipList was NULL or Count was 0");
  195. LogSendRecieveInfo("::EXIT");
  196. bBreak = true;
  197. }
  198. break;
  199. }
  200. if(bBreak || theApp.m_bAppExiting)
  201. break;
  202. }
  203. if(pClipList)
  204. {
  205. delete pClipList;
  206. pClipList = NULL;
  207. LogSendRecieveInfo("::ERROR pClipList was not NULL something is wrong");
  208. }
  209. if(pClip)
  210. {
  211. delete pClip;
  212. pClip = NULL;
  213. LogSendRecieveInfo("::ERROR pClip was not NULL something is wrong");
  214. }
  215. closesocket(socket);
  216. LogSendRecieveInfo("*********************End of ClientThread*********************");
  217. return 0;
  218. }