📄 dbsvr.cpp
字号:
// dbsvr.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include "dbsvr.h"
#include "dbdef.h"
#include "ccdb.h"
#include "BusDef.h"
#include "cc_data_struct.h"
#define DEV_ADDR_POS 8+CC_DEVIE_NAME_LEN+CC_DEVICE_NUM_LEN//将系统地址和节点地址作为一个int类型来处理
#include "database.h"
#define MSG_DBACTION 4001
BOOL InitWinsock();
CWinThread *pThreadDb;
CWinThread *pThreadSocket;
UINT DbServerThread( LPVOID pParam );
UINT DbSocketServerThread( LPVOID pParam );
bool WaitForDataRecv(SOCKET skClient, int nSec);
bool IsSocketClose(SOCKET skClient);
bool bSockeRun;
extern void InitDb();
extern void Init();
extern int ModifyData(ReqParamStruct *pstrReqParam,RetResultStruct **pOut,BOOL bSyn);
extern void FreeResult(RetResultStruct **pOut);
extern void writebuginfo(const char* lpszFormat, ...);
extern CDataBase g_DataBase;
CRITICAL_SECTION g_DbCritialSection;
CMap<int,int,unsigned short,unsigned short> g_DevValueMap;//(设备地址+系统地址)、状态值
//CMap<int,int,unsigned short,unsigned short> g_DevOperSourceMap;//设备ID、
void CALLBACK TimerFunDay( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );
void CALLBACK TimerFunBackUp( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );
int DbRecove();
UINT g_TimerFunDayID=0;
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
// Main message loop:
struct sockaddr_in local;
// struct sockaddr_in from;
// int fromlen =sizeof(from);
int nret;
char buffer[1024]="\0";
HRESULT hr = NOERROR; // Error code reporting
SOCKET socket1;
ReqParamStruct reqparam;
RetResultStruct *pCur,*pRetResultStruct=NULL;
CTime tm; int t;
HANDLE hMutex=CreateMutex(NULL,FALSE,L"DBSERVER");
if(hMutex ==NULL)
{
MessageBox(NULL,L"dbsvr",L"Create mutex Error!",MB_OK);
return -1;
}
if(GetLastError() ==ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
MessageBox(NULL,L"dbsvr",L"Already exist!",MB_OK);
return -1;
}
Init();
hr=CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(FAILED(hr))
{
MessageBox(NULL,L"数据库接口初始化错误!",L"数据库错误",MB_OK);
goto ErrRet;
}
// writebuginfo(L"Enter DbSvr+++++++++\r\n");
if(!InitWinsock())
{
CloseHandle(hMutex);
MessageBox(NULL,L"Socket Error!",L"dbsvr",MB_OK);
return -1;
}
local.sin_family=AF_INET;
local.sin_port=htons(COMM_PORT); ///监听端口
// local.sin_addr.s_addr= inet_addr("127.0.0.1"); ///本机
local.sin_addr.s_addr=htonl(INADDR_ANY);
// socket1=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
if((socket1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
{
MessageBox(NULL,L"Creat",L"Create Error!",MB_OK);
goto ErrRet;
}
if(bind(socket1, (struct sockaddr *)&local, sizeof(struct sockaddr_in)) == SOCKET_ERROR){
//Throw Error
MessageBox(NULL,L"Bind",L"Bind Error!",MB_OK);
goto ErrRet;
}
if(listen(socket1, 10) == SOCKET_ERROR){
//Throw Error
MessageBox(NULL,L"Listen",L"Listen Error!",MB_OK);
goto ErrRet;
}
//初始化设备状态列表
reqparam.nBusID =BUSINESS_DEV;
reqparam.nMethod =ACTION_QUERYALL;
reqparam.nSize=0;
reqparam.pBuf=NULL;
nret=ModifyData(&reqparam,&pRetResultStruct,FALSE);
pCur=pRetResultStruct;
while(pCur)
{
g_DevValueMap.SetAt(*((int*)((char *)pCur->pBuf +DEV_ADDR_POS)),0);
pCur=pCur->pNext;
}
FreeResult(&pRetResultStruct);
::InitializeCriticalSection(&g_DbCritialSection);
//启动定时器,凌晨开始处理
#ifdef _USEBYLHL
g_TimerFunDayID=SetTimer(NULL,101,3*60000,TimerFunDay);
SetTimer(NULL,101,3*60000,TimerFunBackUp);//频率为3分钟
#else
tm=CTime::GetCurrentTime();
t=24*60 -tm.GetHour()*60 -tm.GetMinute();
g_TimerFunDayID=SetTimer(NULL,101,t*60000,TimerFunDay);
SetTimer(NULL,102,60*60000,TimerFunBackUp);//频率为1小时
#endif
//启动TCP服务线程
pThreadDb =AfxBeginThread(DbServerThread,NULL);
bSockeRun=TRUE;
pThreadSocket =AfxBeginThread(DbSocketServerThread,LPVOID(&socket1));
#ifdef _USEBYLHL
MessageBox(NULL,L"running!",L"DbSvr",MB_OK);
#else
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
};
#endif
/* while (1)
{
SOCKET skClient = accept(socket1,NULL, NULL);
if(skClient ==INVALID_SOCKET )
{
MessageBox(NULL,L"Accept!",L"post thread message!",MB_OK);
break;
}
SOCKET *pSocket=new SOCKET;
*pSocket=skClient;
// MessageBox(NULL,L"Accept Ok!",L"post thread message!",MB_OK);
PostThreadMessage(pThreadDb->m_nThreadID,MSG_DBACTION,((WPARAM )pSocket),0);
// Sleep(500);
}
*/
bSockeRun=FALSE;
::PostThreadMessage(pThreadDb->m_nThreadID,WM_QUIT,0,0);
ErrRet:
closesocket(socket1);
WSACleanup();
CoUninitialize();
CloseHandle(hMutex);
// writebuginfo(L"Exit DbSvr+++++++++\r\n");
return 0;
}
BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
// WCHAR cwTemp[30];
// swprintf(cwTemp,L"Socket Startup err=%d \r\n",Error);
// writebuginfo(cwTemp);
writebuginfo("file:%s,line:%d\r\n",__FILE__,__LINE__);
return FALSE;
}
else
{
// if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
// WCHAR cwTemp[30];
// swprintf(cwTemp,L"Socket Ver =%d.%d \r\n",LOBYTE(WsaData.wVersion),HIBYTE(WsaData.wHighVersion));
// writebuginfo(cwTemp);
// WSACleanup();
// return FALSE;
}
}
return TRUE;
}
UINT DbServerThread( LPVOID pParam )
{
MSG msg;
BOOL bSyn;
int nrecv,nret,nsend;
char buf[MAX_PACKET_LENGTH]="";
char sendbuf[1024]="";
int npacket=0;WCHAR cwTemp[100];
RetResultStruct *pCur,*pNext,*pRetResultStruct=NULL;
ReqParamStruct ReqParam,*pReqParamStruct;
while (GetMessage(&msg, NULL, 0, 0))
{//调用数据库执行函数
switch(msg.message)
{
case MSG_DBACTION:
{//处理数据库操作请求
//1.接收数据
if(!WaitForDataRecv(*(SOCKET*)msg.wParam,SECONT_TO_WAIT))
{
writebuginfo("DbSvr recv data err \n");
goto DBACTION_ERR;
}
memset(buf,0,MAX_PACKET_LENGTH);
nrecv =recv(*(SOCKET*)msg.wParam,buf,MAX_PACKET_LENGTH,0);
if(nrecv == SOCKET_ERROR)
{
writebuginfo("DbSvr socket recv err \n");
goto DBACTION_ERR;
}
if(IsSocketClose(*(SOCKET*)msg.wParam))
{//数据接收完毕,检查客户端是否关闭
closesocket(*(SOCKET*)msg.wParam);
delete (SOCKET*)msg.wParam;
writebuginfo("Client socket close\n");
return 0;
}
//2.检查接收的数据
if(nrecv < sizeof(ReqParamStruct)+sizeof(int) || *(int*)buf != PMDB_UDPHEADID)
{
writebuginfo("DbSvr err len=%d Or %d!=%d\n",nrecv,*(int*)buf,PMDB_UDPHEADID);
goto DBACTION_ERR;
}
pReqParamStruct=(ReqParamStruct *)(buf + sizeof(int));
if(pReqParamStruct->nSize != nrecv -sizeof(ReqParamStruct)-sizeof(int))
{
writebuginfo("file:%s,line:%d,param size err \n",__FILE__,__LINE__);
goto DBACTION_ERR;
}
memcpy(&ReqParam,buf+sizeof(int),sizeof(ReqParamStruct));
if(ReqParam.pBuf !=0)
bSyn=TRUE;
else bSyn=FALSE;
if(ReqParam.nSize== 0)
{
ReqParam.pBuf =NULL;
}else
{
ReqParam.pBuf =buf+sizeof(ReqParamStruct)+ sizeof(int);
}
// pReqParamStruct->pBuf = buf+sizeof(ReqParamStruct);
//3.数据库操作
pNext=pRetResultStruct=NULL;
::EnterCriticalSection(&g_DbCritialSection);
if(IsSocketClose(*(SOCKET*)msg.wParam))
{//有可能等待时间过长,TCP已经关闭
closesocket(*(SOCKET*)msg.wParam);
delete (SOCKET*)msg.wParam;
::LeaveCriticalSection(&g_DbCritialSection);
writebuginfo("file:%s,line:%d,timeout \n",__FILE__,__LINE__);
return 0;
}
nret=ModifyData(&ReqParam,&pRetResultStruct,bSyn);
::LeaveCriticalSection(&g_DbCritialSection);
if(ERR_PROG_NOTOPEN==nret)
{//执行恢复操作
// writebuginfo(L"begin reback ok");
writebuginfo("file:%s,line:%d****begin reback \n",__FILE__,__LINE__);
if(DbRecove() ==0)
{
/// writebuginfo(L"reback ok");
writebuginfo("file:%s,line:%d****reback ok\n",__FILE__,__LINE__);
::EnterCriticalSection(&g_DbCritialSection);
nret=ModifyData(&ReqParam,&pRetResultStruct,bSyn);
::LeaveCriticalSection(&g_DbCritialSection);
}else
{
writebuginfo("file:%s,line:%d****reback failure,pResult=%d\n",__FILE__,__LINE__,pRetResultStruct);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -