#include "stdafx.h" #include "WaitEventDlg.h" #include "CheckLock.h" #include #include "EarThwormDef.h" #ifndef WM_CLIENTMSG #define WM_CLIENTMSG (WM_USER+0x1002) #endif static HANDLE g_hSend = NULL; static HANDLE g_hClient = NULL; typedef struct ClientMsg { SOCKET sock; char szMsg[MAX_PATH]; }SOCKMSG; typedef enum ClientEvent { kLogin = 1, //登录 kLogout = 2, //退出 kPassok = 3, //许可 kAccessError = 4, //超出节点数 kAskforLogin = 5, //请求登录 kProError = 6, //请求登陆产品不对 kHeartbeat = 7, //心跳判断有效性 }CLIENTEVENT; IMPLEMENT_DYNAMIC(CWaitEventDlg, CDialog) CWaitEventDlg::CWaitEventDlg(CWnd* pParent /*=NULL*/) : CDialog(CWaitEventDlg::IDD, pParent) { m_pCheckLock = NULL; m_bCheckSrvOk = false; } CWaitEventDlg::~CWaitEventDlg() { } void CWaitEventDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC_BUSYPROGRESSC, m_ctlBusy); } BEGIN_MESSAGE_MAP(CWaitEventDlg, CDialog) ON_BN_CLICKED(IDCANCEL, &CWaitEventDlg::OnBnClickedCancel) ON_WM_CLOSE() ON_WM_TIMER() ON_WM_DESTROY() ON_MESSAGE(WM_CLIENTMSG,&CWaitEventDlg::OnClientMsg) END_MESSAGE_MAP() void CWaitEventDlg::SetCheckLock(CCheckLock* pCheckLock) { m_pCheckLock = pCheckLock; } DWORD ClientSockThread(LPVOID pParameter) { if (pParameter == NULL) return 0; ThreadParam* pThreadParam = (ThreadParam*)pParameter; WORD sockVersion = MAKEWORD(1,1); WSADATA wsaData; //The Windows Sockets WSAStartup function initiates use of WS2_32.DLL by a process WSAStartup(sockVersion, &wsaData); //Get the information about client entity SOCKET sclient = (SOCKET)pThreadParam->pCheckLock->m_theSocket; int nRes = 0; //Return val char szBuf[MAX_PATH]; //used to send the validated data to client //int nNetTimeout = 1000;//1秒, //setsockopt(sclient,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); while(TRUE) { memset(szBuf,0,MAX_PATH); //reset //Get the data form client nRes = recv(sclient,szBuf,MAX_PATH,0); /*if ( !::IsWindow(pThreadParam->hWnd) ) { break; }*/ if (nRes == -1 || pThreadParam->pCheckLock->m_bAutocadExit) break; //int nNetTimeout = 1000;//1秒, //setsockopt(sclient,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //post message to mainframewnd; if (strlen(szBuf) > 0) { ClientMsg* pMsg = new ClientMsg; pMsg->sock = sclient; strcpy(pMsg->szMsg,szBuf); if ( ::IsWindow(pThreadParam->hWnd ) ) { ::SendMessage(pThreadParam->hWnd,WM_CLIENTMSG,0,(LPARAM)pMsg); } else { break; } //如果是心跳验证 if (strstr(szBuf,"evn=7") != NULL) { //发向服务端 nRes = send(sclient, szBuf, MAX_PATH, 0);//固定长度 if (nRes == SOCKET_ERROR) { nRes = send(sclient, szBuf, MAX_PATH, 0);//固定长度 } } } } return 0; } UINT SendMessage2LockServerThread(LPVOID pParameter) { if (pParameter == NULL) return 0; ThreadParam* pThreadParam = (ThreadParam*)pParameter; CCheckLock* pCheckLock = pThreadParam->pCheckLock; ProductInfo* pProInfo = &pCheckLock->m_proInfo; //1.网络通讯 WORD nVersion; //used to store the socket version WSADATA wsaData; //used to store info about socket sockaddr_in serverInfo; //used to specify a local or remote endpoint address to which to connect a socket int nRes; //used to store return value //get the version of socket nVersion = MAKEWORD(1,1); begin_pos: //The Windows Sockets WSAStartup function initiates use of WS2_32.DLL by a process nRes = WSAStartup(nVersion,(LPWSADATA)&wsaData); //here we are creating the socket pCheckLock->m_theSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(pCheckLock->m_theSocket == SOCKET_ERROR) { WSACleanup(); goto begin_pos; } //Fill in the sockaddr_in struct serverInfo.sin_family = PF_INET; serverInfo.sin_addr.s_addr = inet_addr(pProInfo->szServer); //随机取注册中的端口号 srand( (unsigned)time(NULL) ); int nindex = rand() % 5; serverInfo.sin_port = htons( pProInfo->nPort[nindex] ); //Connect to the socket we just created nRes = connect(pCheckLock->m_theSocket,(LPSOCKADDR)&serverInfo, sizeof(serverInfo)); if(nRes == SOCKET_ERROR) { WSACleanup(); goto begin_pos; } //获取本地ip 地址 char szHost[64],sHostIP[64]; gethostname(szHost,64); struct hostent* phe = gethostbyname(szHost); if (phe != NULL) { struct in_addr addr; memcpy(&addr,phe->h_addr_list[0],sizeof(struct in_addr)); sprintf(sHostIP,"%s-%s",inet_ntoa(addr),szHost); } else { sprintf(sHostIP,"%s",szHost); } static char szBuf[MAX_PATH]; memset(szBuf,0,MAX_PATH); #if (ARX <=15) sprintf(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2000;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #elif (ARX<=16) sprintf(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2004;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #elif (ARX<=17) sprintf_s(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2008;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #elif (ARX<=18) sprintf_s(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2010;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #elif (ARX<=19) sprintf_s(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2013;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #elif (ARX<=20) sprintf_s(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2016;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #elif (ARX<=21) sprintf_s(szBuf,"ip=%s;pro=%s;ver=%d;evn=%d;cad=AutoCAD2019;",sHostIP,pProInfo->szProCode,pProInfo->dwVersion,kLogin); #endif //strcpy(szBuf,"ip=10.0.2.15;pro=GBMEP;ver=2012;evn=1;cad=AutoCAD2008;"); //CString sBuf = szBuf; //acedGetAcadFrame()->SetWindowText(sBuf); //int nNetTimeout = 1000;//1秒, //setsockopt(pCheckLock->m_theSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); send_pos: //Send the data to the server nRes = send(pCheckLock->m_theSocket, szBuf, MAX_PATH, 0);//固定长度 if(nRes == SOCKET_ERROR) { goto send_pos; } //等待服务端的响应 DWORD ThreadId; g_hClient = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ClientSockThread,(LPVOID)pParameter,0,&ThreadId); return 0; } BOOL CWaitEventDlg::OnInitDialog() { CDialog::OnInitDialog(); m_ctlBusy.SetNumSteps(20); m_ctlBusy.SetSpeed(250); m_ctlBusy.SetRange(-100, 100); m_ctlBusy.SetBusyType(BPC_BUSY_LTR); m_ctlBusy.Start(); SetTimer(1000, 1000, NULL); m_threadParam.hWnd = m_hWnd; m_threadParam.pCheckLock = m_pCheckLock; //等待服务端的响应 DWORD ThreadId; g_hSend = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SendMessage2LockServerThread,(LPVOID)&m_threadParam,0,&ThreadId); return TRUE; } void CWaitEventDlg::OnBnClickedCancel() { if (g_hSend) { if (::TerminateThread(g_hSend, 0)) g_hSend = NULL; } if (g_hClient) { if (::TerminateThread(g_hClient, 0)) g_hClient = NULL; } OnCancel(); } void CWaitEventDlg::OnClose() { } void CWaitEventDlg::OnTimer(UINT_PTR nIDEvent) { int nLower, nUpper; int nCurPos = m_ctlBusy.GetCurPos(); m_ctlBusy.GetRange(nLower, nUpper); if ( nCurPos >= nUpper-nLower) m_ctlBusy.SetCurPos(0); else m_ctlBusy.StepIt(); CDialog::OnTimer(nIDEvent); } void CWaitEventDlg::OnDestroy() { m_ctlBusy.End(); KillTimer(1000); CDialog::OnDestroy(); } void ParaseScript(LPCTSTR pszMsg,CStringArray& arEves) { //ip=;pro=;ver=;evn=;cad=; int nindex = 0,npos = 0; CString sText = pszMsg; CString sTemp; nindex = sText.Find(_T("=")); if (nindex != -1) { npos = sText.Find(_T(";")); if (npos != -1) { sTemp = sText.Mid(nindex + 1,npos - nindex - 1); arEves.Add(sTemp); if (npos + 1 < sText.GetLength() ) { sTemp = sText.Mid(npos + 1); if (!sTemp.IsEmpty()) { ParaseScript(sTemp,arEves); } } } } } LRESULT CWaitEventDlg::OnClientMsg(WPARAM wp,LPARAM lp) { ClientMsg* pMsg = (ClientMsg*)lp; if (pMsg != NULL) { //解释 szBuf 脚本格式 ip=;pro=;ver=;evn=;cad=; //登录者请求事件 CStringArray arEves; CString sMsg = pMsg->szMsg; ParaseScript(sMsg,arEves); if (arEves.GetSize() >= 5) { ClientEvent nEve = (ClientEvent)_ttoi(arEves.GetAt(3)); switch(nEve) { case kPassok: { //AfxMessageBox(_T("服务端允许登录!!")); m_bCheckSrvOk = true; break; } case kAccessError: { AfxMessageBox(_T("网络锁许可节点数已经用完! 服务端不允许登录!")); break; } case kProError: { AfxMessageBox(_T("网络锁中未注册该产品! 服务端不允许登录!")); break; } case kHeartbeat: { // break; } default: break; } } } DELETE_PTR(pMsg); EndDialog(IDOK); return 0; }