//--------------------------------------------------------------------------- #include #pragma hdrstop #include "DMNetServerF.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "IdAntiFreeze" #pragma link "IdAntiFreezeBase" #pragma link "IdBaseComponent" #pragma link "IdComponent" #pragma link "IdUDPBase" #pragma link "IdUDPServer" #pragma link "IdUDPClient" #pragma resource "*.dfm" //--------------------------------------------------------------------------- TDMNetServer *DMNetServer = NULL; //--------------------------------------------------------------------------- DWORD ip2ulong(char *AIp); char *ulong2ip(DWORD AIp); //void VMS_NetworkToHost(INT_VMS_STATE *AState); //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TDMNetServer::TDMNetServer(TComponent* Owner) : TDataModule(Owner) { FHandle = 0; DataQ = NULL; } //--------------------------------------------------------------------------- void __fastcall TDMNetServer::DataModuleDestroy(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TDMNetServer::FUDPSvrUDPRead(TIdUDPListenerThread *AThread, TBytes AData, TIdSocketHandle *ABinding) { int nRecvLen = 0; if (AData.Length <= 0) { return; } #if 0 if (DataQ->QIdx >= MAX_UDP_MSG_Q) DataQ->QIdx = 0; IPC_MSG_DATA *DATA = (IPC_MSG_DATA*)&DataQ->Rx[DataQ->QIdx++]; DATA->Sender.IP = ip2ulong(AnsiString(ABinding->PeerIP).c_str()); DATA->Sender.Port = ABinding->PeerPort; nRecvLen = AData.get_length(); if (AData.Length > INT_MAX_PACKET_SIZE) { nRecvLen = INT_MAX_PACKET_SIZE; } memset((char*)&DATA->Pkt, 0x00, INT_MAX_PACKET_SIZE); memcpy((char*)&DATA->Pkt, &AData[0], nRecvLen); // DATA->Pkt.head.Length = (DATA->Pkt.head.Length); //RecvDataCommon(&DATA->Pkt); if (FHandle) { if (!PostMessage(FHandle, WM_CENTERCOMM_DATA_RECV, (WPARAM)DATA->Pkt.head.OpCode, (LPARAM)DATA)) { #if 0 Application->NormalizeTopMosts(); Application->MessageBox(L"½Ã½ºÅÛ¿¡¼­ ¾Ë¼ö¾ø´Â ¿À·ù°¡ ¹ß»ýÇß½À´Ï´Ù.\r\nÇÁ·Î±×·¥À» ´Ù½Ã ±âµ¿ÇØ ÁÖ¼¼¿ä.", L"½Ã½ºÅÛ ¿À·ù", MB_OK|MB_ICONERROR|MB_APPLMODAL); Application->RestoreTopMosts(); #endif } } #endif } //--------------------------------------------------------------------------- void __fastcall TDMNetServer::Close() { if (DataQ) { free(DataQ); DataQ = NULL; } //if (FUDPSvr->Active == true) { FUDPSvr->Active = false; for (int ii = 0; ii < FUDPSvr->Bindings->Count; ii++) { FUDPSvr->Bindings->Items[ii]->Free(); } } } //--------------------------------------------------------------------------- String __fastcall TDMNetServer::GetLocalIP() { WSAData wsaData; char szHostName[256]; PHOSTENT pHostnet = NULL; char *pAddr; String sReturnIP; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) return "127.0.0.1"; if (gethostname(szHostName, sizeof(szHostName)) != 0) return "127.0.0.1"; pHostnet = gethostbyname(szHostName); if (pHostnet == NULL) return "127.0.0.1"; pAddr = *(pHostnet->h_addr_list); sReturnIP.sprintf(L"%d.%d.%d.%d", (unsigned char)pAddr[0], (unsigned char)pAddr[1], (unsigned char)pAddr[2], (unsigned char)pAddr[3]); WSACleanup(); return sReturnIP; } //--------------------------------------------------------------------------- int __fastcall TDMNetServer::Open(int ABuffSize) { int nResult = VERR_NONE; if (ABuffSize < 8192) ABuffSize = 8192; try { DataQ = (UDP_DATA_Q*)malloc(sizeof(UDP_DATA_Q)); if (!DataQ) { return VERR_MEMORY_ALLOC; } DataQ->QIdx = 0; FUDPSvr->Active = false; FUDPSvr->Bindings->Clear(); FUDPSvr->DefaultPort = Info.UdpPort; #if 0 FUDPSvr->Binding->IP = GetLocalIP(); FUDPSvr->Binding->Port = Info.UdpPort; #endif FUDPSvr->BufferSize = ABuffSize; FUDPSvr->IPVersion = Id_IPv4; FUDPSvr->ThreadedEvent = true; FUDPSvr->Active = true; } catch(Exception &e) { ErrorMsg = AnsiString(e.ClassName()+e.Message); nResult = VERR_OTHER; } return nResult; } //--------------------------------------------------------------------------- int __fastcall TDMNetServer::GetPort() { return (int)Info.UdpPort; } //--------------------------------------------------------------------------- String __fastcall TDMNetServer::GetIP() { #if 0 ShowMessage(FUDPSvr->Binding->IP); ShowMessage(String(FUDPSvr->Bindings->Count)); ShowMessage(FUDPSvr->Bindings->Items[0]->IP); #endif return FUDPSvr->Binding->IP; } //--------------------------------------------------------------------------- #if 0 int __fastcall TDMNetServer::RecvDataCommon(INT_PACKET *PKT) { switch(PKT->head.OpCode) { case INT_OP_VMS_POWER_CTL: break; case INT_OP_VMS_RESET: break; case INT_OP_VMS_PARA_SET: { } break; case INT_OP_VMS_PARA_SET2: { } break; case INT_OP_VMS_STATE_RES: { } break; case INT_OP_VMS_PARAM_RES: { } break; case INT_OP_VMS_COMMON: break; case INT_OP_VMS_COMMON_EXT: { } break; } return 0; } #endif //--------------------------------------------------------------------------- BYTE __fastcall TDMNetServer::GetNextPktSeq() { return (FPktSeq++ & 0xFF); } //--------------------------------------------------------------------------- int __fastcall TDMNetServer::SendData(DWORD AHost, int APort, BYTE *AData, int ALen) { int nResult = -1; try { TBytes sendBytes; sendBytes.Length = ALen; ZeroMemory(&sendBytes[0], ALen); CopyMemory(&sendBytes[0], AData, ALen); String sToHost = String(ulong2ip(AHost)); try { #if 0 //TODO: UDP ERROR //FUDPSvr->Binding->SendTo(sToHost, (WORD)APort, sendBytes, Id_IPv4); FUDPSvr->SendBuffer(sToHost, (WORD)APort, Id_IPv4, sendBytes); #else FUDPCli->Host = sToHost; FUDPCli->Port = (WORD)APort; FUDPCli->SendBuffer(sendBytes); #endif nResult = ALen; } catch(EIdSocketError &e) { //»ó´ë¹æ ¼ÒÄÏÀÌ ¿­·Á ÀÖÁö ¾ÊÀ¸¸é Indy¿¡¼­ ¿À·ù°¡ ¹ß»ýÇÔ. //ShowMessage(AHost + "." + String(APort) + ": " + e.ToString()); } } catch(Exception &e) { ErrorMsg = AnsiString(e.ClassName()+e.Message); } return nResult; } //--------------------------------------------------------------------------- int __fastcall TDMNetServer::SendData(String AHost, int APort, BYTE *AData, int ALen) { int nResult = VERR_OTHER; try { TBytes sendBytes; sendBytes.Length = ALen; ZeroMemory(&sendBytes[0], ALen); CopyMemory(&sendBytes[0], AData, ALen); try { FUDPCli->Host = AHost; FUDPCli->Port = (WORD)APort; FUDPCli->SendBuffer(sendBytes); nResult = VERR_NONE; } catch(EIdSocketError &e) { nResult = VERR_INTERNAL; //»ó´ë¹æ ¼ÒÄÏÀÌ ¿­·Á ÀÖÁö ¾ÊÀ¸¸é Indy¿¡¼­ ¿À·ù°¡ ¹ß»ýÇÔ. //ShowMessage(AHost + "." + String(APort) + ": " + e.ToString()); } } catch(Exception &e) { nResult = VERR_MEMORY_ALLOC; ErrorMsg = AnsiString(e.ClassName()+e.Message); } return nResult; } //---------------------------------------------------------------------------