123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #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;
- }
- //---------------------------------------------------------------------------
|