?? 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 + -