CSocketClient.cpp

来源:互联网 发布:网络摄像机软件 编辑:程序博客网 时间:2024/06/08 03:55
#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;
}
0 0