DMNetServerF.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "DMNetServerF.h"
  5. //---------------------------------------------------------------------------
  6. #pragma package(smart_init)
  7. #pragma link "IdAntiFreeze"
  8. #pragma link "IdAntiFreezeBase"
  9. #pragma link "IdBaseComponent"
  10. #pragma link "IdComponent"
  11. #pragma link "IdUDPBase"
  12. #pragma link "IdUDPServer"
  13. #pragma link "IdUDPClient"
  14. #pragma resource "*.dfm"
  15. //---------------------------------------------------------------------------
  16. TDMNetServer *DMNetServer = NULL;
  17. //---------------------------------------------------------------------------
  18. DWORD ip2ulong(char *AIp);
  19. char *ulong2ip(DWORD AIp);
  20. //void VMS_NetworkToHost(INT_VMS_STATE *AState);
  21. //---------------------------------------------------------------------------
  22. //---------------------------------------------------------------------------
  23. __fastcall TDMNetServer::TDMNetServer(TComponent* Owner)
  24. : TDataModule(Owner)
  25. {
  26. FHandle = 0;
  27. DataQ = NULL;
  28. }
  29. //---------------------------------------------------------------------------
  30. void __fastcall TDMNetServer::DataModuleDestroy(TObject *Sender)
  31. {
  32. Close();
  33. }
  34. //---------------------------------------------------------------------------
  35. void __fastcall TDMNetServer::FUDPSvrUDPRead(TIdUDPListenerThread *AThread, TBytes AData,
  36. TIdSocketHandle *ABinding)
  37. {
  38. int nRecvLen = 0;
  39. if (AData.Length <= 0)
  40. {
  41. return;
  42. }
  43. #if 0
  44. if (DataQ->QIdx >= MAX_UDP_MSG_Q) DataQ->QIdx = 0;
  45. IPC_MSG_DATA *DATA = (IPC_MSG_DATA*)&DataQ->Rx[DataQ->QIdx++];
  46. DATA->Sender.IP = ip2ulong(AnsiString(ABinding->PeerIP).c_str());
  47. DATA->Sender.Port = ABinding->PeerPort;
  48. nRecvLen = AData.get_length();
  49. if (AData.Length > INT_MAX_PACKET_SIZE)
  50. {
  51. nRecvLen = INT_MAX_PACKET_SIZE;
  52. }
  53. memset((char*)&DATA->Pkt, 0x00, INT_MAX_PACKET_SIZE);
  54. memcpy((char*)&DATA->Pkt, &AData[0], nRecvLen);
  55. // DATA->Pkt.head.Length = (DATA->Pkt.head.Length);
  56. //RecvDataCommon(&DATA->Pkt);
  57. if (FHandle)
  58. {
  59. if (!PostMessage(FHandle, WM_CENTERCOMM_DATA_RECV, (WPARAM)DATA->Pkt.head.OpCode, (LPARAM)DATA))
  60. {
  61. #if 0
  62. Application->NormalizeTopMosts();
  63. Application->MessageBox(L"시스템에서 알수없는 오류가 발생했습니다.\r\n프로그램을 다시 기동해 주세요.",
  64. L"시스템 오류", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  65. Application->RestoreTopMosts();
  66. #endif
  67. }
  68. }
  69. #endif
  70. }
  71. //---------------------------------------------------------------------------
  72. void __fastcall TDMNetServer::Close()
  73. {
  74. if (DataQ)
  75. {
  76. free(DataQ);
  77. DataQ = NULL;
  78. }
  79. //if (FUDPSvr->Active == true)
  80. {
  81. FUDPSvr->Active = false;
  82. for (int ii = 0; ii < FUDPSvr->Bindings->Count; ii++)
  83. {
  84. FUDPSvr->Bindings->Items[ii]->Free();
  85. }
  86. }
  87. }
  88. //---------------------------------------------------------------------------
  89. String __fastcall TDMNetServer::GetLocalIP()
  90. {
  91. WSAData wsaData;
  92. char szHostName[256];
  93. PHOSTENT pHostnet = NULL;
  94. char *pAddr;
  95. String sReturnIP;
  96. if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
  97. return "127.0.0.1";
  98. if (gethostname(szHostName, sizeof(szHostName)) != 0)
  99. return "127.0.0.1";
  100. pHostnet = gethostbyname(szHostName);
  101. if (pHostnet == NULL)
  102. return "127.0.0.1";
  103. pAddr = *(pHostnet->h_addr_list);
  104. sReturnIP.sprintf(L"%d.%d.%d.%d", (unsigned char)pAddr[0],
  105. (unsigned char)pAddr[1],
  106. (unsigned char)pAddr[2],
  107. (unsigned char)pAddr[3]);
  108. WSACleanup();
  109. return sReturnIP;
  110. }
  111. //---------------------------------------------------------------------------
  112. int __fastcall TDMNetServer::Open(int ABuffSize)
  113. {
  114. int nResult = VERR_NONE;
  115. if (ABuffSize < 8192) ABuffSize = 8192;
  116. try
  117. {
  118. DataQ = (UDP_DATA_Q*)malloc(sizeof(UDP_DATA_Q));
  119. if (!DataQ)
  120. {
  121. return VERR_MEMORY_ALLOC;
  122. }
  123. DataQ->QIdx = 0;
  124. FUDPSvr->Active = false;
  125. FUDPSvr->Bindings->Clear();
  126. FUDPSvr->DefaultPort = Info.UdpPort;
  127. #if 0
  128. FUDPSvr->Binding->IP = GetLocalIP();
  129. FUDPSvr->Binding->Port = Info.UdpPort;
  130. #endif
  131. FUDPSvr->BufferSize = ABuffSize;
  132. FUDPSvr->IPVersion = Id_IPv4;
  133. FUDPSvr->ThreadedEvent = true;
  134. FUDPSvr->Active = true;
  135. }
  136. catch(Exception &e)
  137. {
  138. ErrorMsg = AnsiString(e.ClassName()+e.Message);
  139. nResult = VERR_OTHER;
  140. }
  141. return nResult;
  142. }
  143. //---------------------------------------------------------------------------
  144. int __fastcall TDMNetServer::GetPort()
  145. {
  146. return (int)Info.UdpPort;
  147. }
  148. //---------------------------------------------------------------------------
  149. String __fastcall TDMNetServer::GetIP()
  150. {
  151. #if 0
  152. ShowMessage(FUDPSvr->Binding->IP);
  153. ShowMessage(String(FUDPSvr->Bindings->Count));
  154. ShowMessage(FUDPSvr->Bindings->Items[0]->IP);
  155. #endif
  156. return FUDPSvr->Binding->IP;
  157. }
  158. //---------------------------------------------------------------------------
  159. #if 0
  160. int __fastcall TDMNetServer::RecvDataCommon(INT_PACKET *PKT)
  161. {
  162. switch(PKT->head.OpCode)
  163. {
  164. case INT_OP_VMS_POWER_CTL:
  165. break;
  166. case INT_OP_VMS_RESET:
  167. break;
  168. case INT_OP_VMS_PARA_SET:
  169. {
  170. }
  171. break;
  172. case INT_OP_VMS_PARA_SET2:
  173. {
  174. }
  175. break;
  176. case INT_OP_VMS_STATE_RES:
  177. {
  178. }
  179. break;
  180. case INT_OP_VMS_PARAM_RES:
  181. {
  182. }
  183. break;
  184. case INT_OP_VMS_COMMON:
  185. break;
  186. case INT_OP_VMS_COMMON_EXT:
  187. {
  188. }
  189. break;
  190. }
  191. return 0;
  192. }
  193. #endif
  194. //---------------------------------------------------------------------------
  195. BYTE __fastcall TDMNetServer::GetNextPktSeq()
  196. {
  197. return (FPktSeq++ & 0xFF);
  198. }
  199. //---------------------------------------------------------------------------
  200. int __fastcall TDMNetServer::SendData(DWORD AHost, int APort, BYTE *AData, int ALen)
  201. {
  202. int nResult = -1;
  203. try
  204. {
  205. TBytes sendBytes;
  206. sendBytes.Length = ALen;
  207. ZeroMemory(&sendBytes[0], ALen);
  208. CopyMemory(&sendBytes[0], AData, ALen);
  209. String sToHost = String(ulong2ip(AHost));
  210. try
  211. {
  212. #if 0
  213. //TODO: UDP ERROR
  214. //FUDPSvr->Binding->SendTo(sToHost, (WORD)APort, sendBytes, Id_IPv4);
  215. FUDPSvr->SendBuffer(sToHost, (WORD)APort, Id_IPv4, sendBytes);
  216. #else
  217. FUDPCli->Host = sToHost;
  218. FUDPCli->Port = (WORD)APort;
  219. FUDPCli->SendBuffer(sendBytes);
  220. #endif
  221. nResult = ALen;
  222. }
  223. catch(EIdSocketError &e)
  224. {
  225. //상대방 소켓이 열려 있지 않으면 Indy에서 오류가 발생함.
  226. //ShowMessage(AHost + "." + String(APort) + ": " + e.ToString());
  227. }
  228. }
  229. catch(Exception &e)
  230. {
  231. ErrorMsg = AnsiString(e.ClassName()+e.Message);
  232. }
  233. return nResult;
  234. }
  235. //---------------------------------------------------------------------------
  236. int __fastcall TDMNetServer::SendData(String AHost, int APort, BYTE *AData, int ALen)
  237. {
  238. int nResult = VERR_OTHER;
  239. try {
  240. TBytes sendBytes;
  241. sendBytes.Length = ALen;
  242. ZeroMemory(&sendBytes[0], ALen);
  243. CopyMemory(&sendBytes[0], AData, ALen);
  244. try
  245. {
  246. FUDPCli->Host = AHost;
  247. FUDPCli->Port = (WORD)APort;
  248. FUDPCli->SendBuffer(sendBytes);
  249. nResult = VERR_NONE;
  250. }
  251. catch(EIdSocketError &e) {
  252. nResult = VERR_INTERNAL;
  253. //상대방 소켓이 열려 있지 않으면 Indy에서 오류가 발생함.
  254. //ShowMessage(AHost + "." + String(APort) + ": " + e.ToString());
  255. }
  256. }
  257. catch(Exception &e) {
  258. nResult = VERR_MEMORY_ALLOC;
  259. ErrorMsg = AnsiString(e.ClassName()+e.Message);
  260. }
  261. return nResult;
  262. }
  263. //---------------------------------------------------------------------------