#include "StdAfx.h"
#include "Ksf1MonitorClient.h"
#include <windows.h>
#include "CInterface.h"
// 接收客户端线程
DWORD __stdcall Acceptthread(void *p);
CKsf1MonitorClient::CKsf1MonitorClient(void)
{
}
CKsf1MonitorClient::~CKsf1MonitorClient(void)
{
}
void CKsf1MonitorClient::Init(int msgLevel, HANDLE hQuit)
{
m_nMsgLevel = msgLevel;
m_nHeaderLen = 9;
m_sServer = INVALID_SOCKET;
m_hQuit = hQuit;
m_bIsConnect = false;
}
// 加载配置
void CKsf1MonitorClient::LoadConfig(void)
{
char sConfig[100] = "c:\\OptOffer\\monitor.ini";
char sNode[100] = "COMMON";
const int LEN = 1024;
char sTemp[LEN] = {0};
char sKey[100];
sprintf(sKey, "ip");
GetPrivateProfileString(sNode, sKey, "10.253.46.123", sTemp, LEN, sConfig);
strcpy(m_sIP, sTemp);
sprintf(sKey, "port");
m_nPort = GetPrivateProfileInt(sNode, sKey, 6892, sConfig);
sprintf(sKey, "interval");
m_nInterval = GetPrivateProfileInt(sNode, sKey, 3000, sConfig);
sprintf(sKey, "connchecktime");
m_nConnchecktime = GetPrivateProfileInt(sNode, sKey, 3000, sConfig);
sprintf(sKey, "connsleeptime");
m_nConnsleeptime = GetPrivateProfileInt(sNode, sKey, 10000, sConfig);
}
bool CKsf1MonitorClient::Close()
{
DisConnect();
// 释放套接字资源
WSACleanup();
return true;
}
void CKsf1MonitorClient::DisConnect()
{
m_bIsConnect = false;
// 关闭套接字
if (INVALID_SOCKET != m_sServer)
{
closesocket(m_sServer);
m_sServer = INVALID_SOCKET;
}
}
bool CKsf1MonitorClient::IsConnect()
{
return m_bIsConnect;
}
// 接收客户端线程
DWORD __stdcall ConnectthreadEx(void *p)
{
CKsf1MonitorClient *pKClt;
pKClt = (CKsf1MonitorClient *)p;
pKClt->Connectthread();
return 0;
}
bool CKsf1MonitorClient::Start()
{
bool bRet = false;
LoadConfig();
// 创建线程,接收客户端连接
unsigned long pid;
HANDLE hThread = CreateThread(NULL,NULL,ConnectthreadEx,this,CREATE_SUSPENDED,&pid);
if(NULL == hThread)
{
ShowMessageInfo(m_nMsgLevel, "创建报盘监控客户端连接线程失败!");
return bRet;
}
ResumeThread(hThread);
return true;
}
// 连接监控服务器线程
void CKsf1MonitorClient::Connectthread()
{
WSADATA wsd; //WSADATA变量
SOCKADDR_IN servAddr; //服务器地址
int retVal; //返回值
//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr(m_sIP);
servAddr.sin_port = htons(m_nPort);
int nServAddlen = sizeof(servAddr);
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient WSAStartup failed!");
return;
}
//连接服务器
while(true)
{
// 退出信号量
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hQuit, 0))
{
ReleaseSemaphore(m_hQuit,1,NULL);
break;
}
if (m_bIsConnect)
{
Sleep(m_nConnsleeptime);
continue;
}
//创建套接字
closesocket(m_sServer);
m_sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == m_sServer)
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient socket failed!");
Sleep(m_nConnchecktime);
return;
}
retVal=connect(m_sServer,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
{
m_bIsConnect = false;
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient connect failed, reconnect server...");
Sleep(m_nConnchecktime);
continue;
}
m_bIsConnect = true;
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient connect [%s] success!", m_sIP);
}
Close();
}
// 发送数据给客户端
bool CKsf1MonitorClient::SendData(char *sendBuf, int len)
{
bool bRet = false;
if (!IsConnect())
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient SendData failed, IsConnect is false");
return bRet;
}
if(sendBuf[0] == '\0')
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient SendData failed, sendBuf is null");
return bRet;
}
if (SOCKET_ERROR == send(m_sServer, sendBuf, len, 0))
{
int lastError = WSAGetLastError();
// 发送失败,重连监控服务器
m_bIsConnect = false;
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient SendData failed, lastError=%d", lastError);
return bRet;
}
return true;
}
#include "Ksf1MonitorClient.h"
#include <windows.h>
#include "CInterface.h"
// 接收客户端线程
DWORD __stdcall Acceptthread(void *p);
CKsf1MonitorClient::CKsf1MonitorClient(void)
{
}
CKsf1MonitorClient::~CKsf1MonitorClient(void)
{
}
void CKsf1MonitorClient::Init(int msgLevel, HANDLE hQuit)
{
m_nMsgLevel = msgLevel;
m_nHeaderLen = 9;
m_sServer = INVALID_SOCKET;
m_hQuit = hQuit;
m_bIsConnect = false;
}
// 加载配置
void CKsf1MonitorClient::LoadConfig(void)
{
char sConfig[100] = "c:\\OptOffer\\monitor.ini";
char sNode[100] = "COMMON";
const int LEN = 1024;
char sTemp[LEN] = {0};
char sKey[100];
sprintf(sKey, "ip");
GetPrivateProfileString(sNode, sKey, "10.253.46.123", sTemp, LEN, sConfig);
strcpy(m_sIP, sTemp);
sprintf(sKey, "port");
m_nPort = GetPrivateProfileInt(sNode, sKey, 6892, sConfig);
sprintf(sKey, "interval");
m_nInterval = GetPrivateProfileInt(sNode, sKey, 3000, sConfig);
sprintf(sKey, "connchecktime");
m_nConnchecktime = GetPrivateProfileInt(sNode, sKey, 3000, sConfig);
sprintf(sKey, "connsleeptime");
m_nConnsleeptime = GetPrivateProfileInt(sNode, sKey, 10000, sConfig);
}
bool CKsf1MonitorClient::Close()
{
DisConnect();
// 释放套接字资源
WSACleanup();
return true;
}
void CKsf1MonitorClient::DisConnect()
{
m_bIsConnect = false;
// 关闭套接字
if (INVALID_SOCKET != m_sServer)
{
closesocket(m_sServer);
m_sServer = INVALID_SOCKET;
}
}
bool CKsf1MonitorClient::IsConnect()
{
return m_bIsConnect;
}
// 接收客户端线程
DWORD __stdcall ConnectthreadEx(void *p)
{
CKsf1MonitorClient *pKClt;
pKClt = (CKsf1MonitorClient *)p;
pKClt->Connectthread();
return 0;
}
bool CKsf1MonitorClient::Start()
{
bool bRet = false;
LoadConfig();
// 创建线程,接收客户端连接
unsigned long pid;
HANDLE hThread = CreateThread(NULL,NULL,ConnectthreadEx,this,CREATE_SUSPENDED,&pid);
if(NULL == hThread)
{
ShowMessageInfo(m_nMsgLevel, "创建报盘监控客户端连接线程失败!");
return bRet;
}
ResumeThread(hThread);
return true;
}
// 连接监控服务器线程
void CKsf1MonitorClient::Connectthread()
{
WSADATA wsd; //WSADATA变量
SOCKADDR_IN servAddr; //服务器地址
int retVal; //返回值
//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr(m_sIP);
servAddr.sin_port = htons(m_nPort);
int nServAddlen = sizeof(servAddr);
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient WSAStartup failed!");
return;
}
//连接服务器
while(true)
{
// 退出信号量
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hQuit, 0))
{
ReleaseSemaphore(m_hQuit,1,NULL);
break;
}
if (m_bIsConnect)
{
Sleep(m_nConnsleeptime);
continue;
}
//创建套接字
closesocket(m_sServer);
m_sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == m_sServer)
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient socket failed!");
Sleep(m_nConnchecktime);
return;
}
retVal=connect(m_sServer,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
{
m_bIsConnect = false;
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient connect failed, reconnect server...");
Sleep(m_nConnchecktime);
continue;
}
m_bIsConnect = true;
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient connect [%s] success!", m_sIP);
}
Close();
}
// 发送数据给客户端
bool CKsf1MonitorClient::SendData(char *sendBuf, int len)
{
bool bRet = false;
if (!IsConnect())
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient SendData failed, IsConnect is false");
return bRet;
}
if(sendBuf[0] == '\0')
{
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient SendData failed, sendBuf is null");
return bRet;
}
if (SOCKET_ERROR == send(m_sServer, sendBuf, len, 0))
{
int lastError = WSAGetLastError();
// 发送失败,重连监控服务器
m_bIsConnect = false;
ShowMessageInfo(m_nMsgLevel, "CKsf1MonitorClient SendData failed, lastError=%d", lastError);
return bRet;
}
return true;
}