gck-ms-original/GCKMSDlg.cpp

359 lines
7.4 KiB
C++
Raw Permalink Blame History

// GCKMSDlg.cpp : implementation file
//
#include "stdafx.h"
#include "GCKMS.h"
#include "GCKMSDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGCKMSDlg dialog
CGCKMSDlg::CGCKMSDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGCKMSDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CGCKMSDlg)
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CGCKMSDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGCKMSDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGCKMSDlg, CDialog)
//{{AFX_MSG_MAP(CGCKMSDlg)
ON_WM_CLOSE()
ON_WM_ENDSESSION()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGCKMSDlg message handlers
void CGCKMSDlg::OnClose()
{
int i;
if(m_ID_list.empty() == FALSE)
{
for(i = 0; i < m_ID_list.size(); i ++)
{
KillTimer(m_ID_list[i] + 1000);
}
}
m_ID_list.clear();
m_IP_list.clear();
m_port_list.clear();
m_wsUDPS.Close();
for(i = 0; i < m_wsTCPS_list.size(); i ++)
{
m_wsTCPS_list[i]->m_Data = "";
m_wsTCPS_list[i]->m_dta.clear();
m_wsTCPS_list[i]->ShutDown(2);
m_wsTCPS_list[i]->Close();
delete m_wsTCPS_list[i];
}
m_wsTCPS_list.clear();
DestroyWindow();
CDialog::OnClose();
}
void CGCKMSDlg::OnCancel()
{
OnClose();
}
void CGCKMSDlg::OnOK()
{
}
void CGCKMSDlg::OnEndSession(BOOL bEnding)
{
OnClose();
}
BOOL CGCKMSDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString txt;
CWSTCPS *wsTCPS;
SetIcon(m_hIcon, TRUE);
if(m_wsUDPS.Create(27900, SOCK_DGRAM, FD_READ) != FALSE)
{
txt = " - UDP server running";
}
// test.Create(111, SOCK_DGRAM, FD_READ);
// test.SendTo("\\heartbeat\\8911\\gamename\\giants", 31, 27900, "gckms.no-ip.org");
m_wsTCPS_list.push_back(wsTCPS);
m_wsTCPS_list[0] = new CWSTCPS;
if(m_wsTCPS_list[0]->Create(28900, SOCK_STREAM, FD_ACCEPT | FD_READ | FD_CLOSE) != FALSE)
{
if(m_wsTCPS_list[0]->Listen() != FALSE)
{
SetTimer(ID_TCPS_TIMER, 30000, NULL);
if(txt == "")
{
txt = " - TCP server running";
}
else
{
txt = txt + " | TCP server running";
}
}
}
SetWindowText("GCKMS" + txt);
return TRUE;
}
void CGCKMSDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CGCKMSDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CGCKMSDlg::OnUDPS_Receive(int nErrorCode)
{
if(nErrorCode == 0)
{
DWORD rcv;
int rcv2;
CString IP;
UINT port;
char *dta;
CString txt;
m_wsUDPS.IOCtl(FIONREAD, &rcv);
dta = new char[rcv + 1];
rcv2 = m_wsUDPS.ReceiveFrom(dta, rcv, IP, port);
dta[rcv2] = '\0';
txt = dta;
delete [] dta;
if(IP.Left(7) == "192.168")
{
IP = inet_ntoa(*((struct in_addr*)gethostbyname("gckms.no-ip.org")->h_addr_list[0]));
}
if(m_IP_list.size() < 1000 && (txt.Left(1) == "0" || txt.Left(1) == "1"))
{
if(m_ID_list.empty() != FALSE && txt.Left(1) == "0")
{
int i;
m_ID_list.push_back(0);
m_IP_list.push_back(IP);
m_port_list.push_back(atoi(txt.Mid(1)));
SetTimer(1000, 360000, NULL);
for(i = 1; i < m_wsTCPS_list.size(); i ++)
{
m_wsTCPS_list[i]->Send("00<EFBFBD>" + IP + "<EFBFBD>" + txt.Mid(1) + '\0', IP.GetLength() + txt.Mid(1).GetLength() + 5);
}
}
else
{
int i;
BOOL isIPnP;
isIPnP = FALSE;
for(i = 0; i < m_ID_list.size(); i ++)
{
if(m_IP_list[i] == IP && m_port_list[i] == atoi(txt.Mid(1)))
{
KillTimer(m_ID_list[i]);
SetTimer(m_ID_list[i] + 1000, 360000, NULL);
if(txt.Left(1) == "1")
{
int j;
CString txt2;
txt2.Format("%d", m_ID_list[i]);
for(j = 1; j < m_wsTCPS_list.size(); j ++)
{
m_wsTCPS_list[j]->Send("1" + txt2 + '\0', txt2.GetLength() + 2);
}
}
isIPnP = TRUE;
break;
}
}
if(isIPnP == FALSE && txt.Left(1) == "0")
{
int j;
BOOL isID;
for(i = 0; i <= 999; i ++)
{
isID = FALSE;
for(j = 0; j < m_ID_list.size(); j ++)
{
if(m_ID_list[j] == i)
{
isID = TRUE;
break;
}
}
if(isID == FALSE)
{
CString txt2;
m_ID_list.push_back(i);
m_IP_list.push_back(IP);
m_port_list.push_back(atoi(txt.Mid(1)));
SetTimer(i + 1000, 360000, NULL);
txt2.Format("%d", i);
for(j = 1; j < m_wsTCPS_list.size(); j ++)
{
m_wsTCPS_list[j]->Send("0" + txt2 + "<EFBFBD>" + IP + "<EFBFBD>" + txt.Mid(1) + '\0', txt2.GetLength() + IP.GetLength() + txt.Mid(1).GetLength() + 4);
}
break;
}
}
}
}
if(txt.Left(1) == "0")
{
m_wsUDPS.SendTo("\\status\\", 8, port, IP);
}
}
}
}
void CGCKMSDlg::OnTCPS_Accept(int nErrorCode)
{
if(m_wsTCPS_list.size() < 1001)
{
CWSTCPS *wsTCPS;
m_wsTCPS_list.push_back(wsTCPS);
m_wsTCPS_list.back() = new CWSTCPS;
m_wsTCPS_list[0]->Accept(*m_wsTCPS_list.back());
if(m_IP_list.empty() == FALSE)
{
int i;
std::string txt;
CString txt2;
CString txt3;
std::vector <char> dta;
for(i = 0; i < m_ID_list.size(); i ++)
{
txt2.Format("%d", m_ID_list[i]);
txt3.Format("%d", m_port_list[i]);
txt.append("0" + txt2 + "<EFBFBD>" + m_IP_list[i] + "<EFBFBD>" + txt3);
dta.insert(dta.end(), txt.begin(), txt.end());
txt = "";
dta.push_back('\0');
}
m_wsTCPS_list.back()->Send(&dta[0], dta.size());
dta.clear();
}
}
}
void CGCKMSDlg::OnTCPS_Receive(int nErrorCode, CWSTCPS *socket)
{
if(nErrorCode == 0)
{
DWORD rcv;
int rcv2;
int i;
char *dta;
((CWSTCPS*)socket)->IOCtl(FIONREAD, &rcv);
dta = new char[rcv];
rcv2 = ((CWSTCPS*)socket)->Receive(dta, rcv);
for(i = 0; i < rcv2; i ++)
{
if(dta[i] != '\0')
{
int j;
for(j = 1; j < m_wsTCPS_list.size(); j ++)
{
if(m_wsTCPS_list[j] == socket)
{
m_wsTCPS_list[j]->m_Data = "";
m_wsTCPS_list[j]->m_dta.clear();
m_wsTCPS_list[j]->ShutDown(2);
m_wsTCPS_list[j]->Close();
delete m_wsTCPS_list[j];
m_wsTCPS_list.erase(&m_wsTCPS_list[j]);
delete [] dta;
return;
}
}
}
}
delete [] dta;
}
}
void CGCKMSDlg::OnTCPS_Close(int nErrorCode, CWSTCPS *socket)
{
int i;
for(i = 1; i < m_wsTCPS_list.size(); i ++)
{
if(m_wsTCPS_list[i] == socket)
{
m_wsTCPS_list[i]->m_Data = "";
m_wsTCPS_list[i]->m_dta.clear();
m_wsTCPS_list[i]->ShutDown(2);
m_wsTCPS_list[i]->Close();
delete m_wsTCPS_list[i];
m_wsTCPS_list.erase(&m_wsTCPS_list[i]);
break;
}
}
}
void CGCKMSDlg::OnTimer(UINT nIDEvent)
{
int i;
for(i = 0; i < m_ID_list.size(); i ++)
{
if(m_ID_list[i] + 1000 == nIDEvent)
{
int j;
CString txt2;
KillTimer(m_ID_list[i] + 1000);
txt2.Format("%d", m_ID_list[i]);
for(j = 1; j < m_wsTCPS_list.size(); j ++)
{
m_wsTCPS_list[j]->Send("2" + txt2 + '\0', txt2.GetLength() + 2);
}
m_ID_list.erase(&m_ID_list[i]);
m_IP_list.erase(&m_IP_list[i]);
m_port_list.erase(&m_port_list[i]);
break;
}
}
if(nIDEvent == ID_TCPS_TIMER)
{
for(i = 1; i < m_wsTCPS_list.size(); i ++)
{
char dta[1];
dta[0] = '\0';
m_wsTCPS_list[i]->Send(dta, 1);
}
}
CDialog::OnTimer(nIDEvent);
}