⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbsvr.cpp

📁 wince下对sqlserver数据库的操作,增删改操作,单进程单线程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -