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;
}
#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
- CSocketClient.cpp
- CSocketClient.h
- cpp
- CPP
- CPP
- cpp
- cpp
- CPP
- CPP
- ClientSockThread.cpp&&ClientUrlThread.cpp
- cpp调用其他cpp
- ex34a.cpp&&ex34aDoc.cpp&&ex34aView.cpp
- MainFrm.cpp&&ServerThread.cpp&&SheetConfig.cpp
- CPP thread
- cpp->html
- CFaderWnd.cpp
- PasswordReminder.cpp
- object.cpp
- LeetCode—318 Maximum Product of Word Lengths
- SSM回滚测试(给自己看)
- linux下如何手动更新Firefox
- OC语言 常用数据类型=>>NSData & NSMutableData
- 如何 解包 ,编辑 ,重新打包boot images
- CSocketClient.cpp
- 分布式哈希表DHT和一致性哈希
- 浅复制&深复制
- jquery实现简单的图片查看器
- C++11新特性,利用std::chrono精简传统获取系统时间的方法
- 什么是scipy、numpy、matplotlib?
- Android NDK开发Crash错误定位
- Linux安装jdk
- python发邮件