winserv2.cpp

来自「用于处理证书请求,生成证书的CA服务器源码,」· C++ 代码 · 共 214 行

CPP
214
字号
#include "caSocket.h"
#include "stdlib.h"
#include "stdio.h"
#include "process.h"
#include "DealAll.h"
#include "Dlodbc.h"
#include "dhodbc.h"
#include "certcreate.h"

#define BUFLEN 18000
#define PACKLEN	2400
caSocket m_Socket;		// Our winSocket wrapper class
BOOL m_bConnected;		// Boolean representing state of application
caSocket abc;
DBCONN dbconn[MAXDBCONN];
HANDLE hMutex=NULL; 
int g_nDebug=0;

#define INIFILE "c:\\fgcca3.ini"

struct param {
	SOCKET m_socket;
};

unsigned int __stdcall  FirstThread(void *pAcceptSocket)
{
	char szRcvBuf[BUFLEN]; 
	char szSndBuf[BUFLEN];
	caSocket def;
	int	nRtn;
	int OutDataLen;

//	printf("ThreadID = %d   SocketID=%d\n",GetCurrentThreadId(),*(SOCKET *)AcceptSocket);
	if(g_nDebug)
		printf("ThreadID=%d,SocketID=%d\n",GetCurrentThreadId(),*(SOCKET *)pAcceptSocket);
	def.m_hSocket = *(SOCKET *)pAcceptSocket;
//	def.m_hSocket = par->m_socket;
	
	memset(szRcvBuf,0,sizeof(szRcvBuf));
	nRtn = def.ExpRead(szRcvBuf,BUFLEN);
//	printf("recv nTotal = %d\n",nRtn);
	nRtn = DealAll(szRcvBuf,nRtn,szSndBuf,BUFLEN,&OutDataLen);

	if(g_nDebug)
		printf("DealAll RTN = %d\n",nRtn);

//	memset(szRcvBuf,'8',sizeof(szRcvBuf));
	nRtn = def.ExpWrite(szSndBuf,OutDataLen);
	//	printf("Snd %d\n",nRtn);
	nRtn = def.Close();
	if(nRtn != 0)
		printf("Close Error\n");


	_endthreadex(0);
	return 0;
}

void main(int argc,char **argv)
{


	int nRtn=0,i=0,nTotal=0;
//	SOCKET AcceptSocket;
	SQLHDBC hdbc=NULL; 
	unsigned char	databasename[30];//="fgog";                                                            
	unsigned char	username[30];//="ca";                                                                  
	unsigned char	password[30];//="fourgold"; 
	char	szIpAddr[30];
	char	szPvkPw[64]="";
	unsigned int nPort=0;
    SOCKET pAcceptSocket[5000];
	int		MAXSOCK=5000;

	//General a CA keypair and CA root certificate
	if(argc > 2)
	{
		if(strncmp(argv[1],"cainit",6) == 0)
		{
			strcpy(szPvkPw,argv[2]);

			nRtn = CACreateCertificate(
								"CAcert.cer",	//根证书导出到该证书文件
								"CAKEY.pvk",	//签名公私钥保存文件
								"CAXKEY.pvk",	//交换公私钥保存文件
								"CAXKEY.pub",	//交换公钥保存文件
								szPvkPw);		//密钥文件口令
			if(nRtn != 0)
			{
    			printf("INIT CA FAIL = %d !\n",nRtn);
				return;
			}

			nRtn = GenSignCert();
			if(nRtn != 0)
    			printf("GenSignCert FAIL = %d !\n",nRtn);
			else
				printf("INIT CA SUCCESSFUL!\n");

		}


		if(strncmp(argv[1],"carestore",9) == 0)
		{
			strcpy(szPvkPw,argv[2]);
			nRtn = doRestore("CAcert.cer","CAKEY.pvk","CAXKEY.pvk",szPvkPw);
		}
		return;   	
	}



	// Create a mutex with no initial owner.

	hMutex = CreateMutex( 
		NULL,                       // no security attributes
		FALSE,                      // initially not owned
		"MutexToProtectDatabase");  // name of mutex
	if (hMutex == NULL) 
	{
		printf("Create Mutex Error!\n");
		return;
	}


	//get database parameter
	GetPrivateProfileString("DATABASE PARA","databasename","fgog",(char *)databasename,sizeof(databasename),INIFILE);
	GetPrivateProfileString("DATABASE PARA","username","ca",(char *)username,sizeof(username),INIFILE);
	GetPrivateProfileString("DATABASE PARA","password","fourgold",(char *)password,sizeof(password),INIFILE);
	//get socket parameter
	GetPrivateProfileString("SOCKET PARA","ipaddr","any",(char *)szIpAddr,sizeof(szIpAddr),INIFILE);
	nPort = GetPrivateProfileInt("SOCKET PARA","port",6768,INIFILE);
	//get debug prarmeter
	g_nDebug = GetPrivateProfileInt("DEBUG PARA","debug",1,INIFILE);


	for(i=0;i<MAXDBCONN;i++)
	{
		hdbc=ConnectDB(databasename, strlen((char *)databasename), username, strlen((char *)username), password, strlen((char *)password));
		if(hdbc != NULL)
		{
			dbconn[i].handle = (long)hdbc;
		}
		else
		{
			printf("conn db error\n");
			return;
		}
	}

	/*
	DWORD dwSerialNum;
	nRtn = DBGetSetSerial(&dwSerialNum);
	ISUCERT* p=NULL;
	DBInsertCertReq(p,dwSerialNum);
	

	DBInsertCert(111,(unsigned char *)"asdfasdfasdf",12);
	*/

	if( abc.Create() != ERR_SUCCESS ) // Create the socket
		return;
	nRtn = abc.Bind(szIpAddr,nPort);
	nRtn = abc.Listen(5);
	
	
	unsigned int dwThreadId; 
	HANDLE hThread; 

	int j=-1;
	while(1)
	{
		j++;
		if(j == MAXSOCK-1)
			j=0;

		for(i=0;i<MAXDBCONN;i++)
		{
			if(dbconn[i].status == 1)
			printf("dbconn[%d]:%d,%d,%d\n",i,dbconn[i].handle,dbconn[i].status,dbconn[i].threadid);
		}
		printf("\n\n");
//		SOCKET *pAcceptSocket = new SOCKET;
		pAcceptSocket[j] = abc.Accept();
//		*pAcceptSocket = abc.Accept();

		if(pAcceptSocket[j] == ERR_WSAERROR)
			continue;

		
	//	_beginthread(FirstThread,0,(void *) &AcceptSocket);

		hThread = (HANDLE) _beginthreadex( 
					   NULL,
					   0,
					   FirstThread,
					   (void*)&pAcceptSocket[j],//&AcceptSocket,
					   0,
					   &dwThreadId);

//		printf("ZThreadID = %d   ZSocketID=%d\n",dwThreadId,(unsigned int)pAcceptSocket[j]);
//		delete pAcceptSocket;
/*
		hThread = CreateThread( 
        NULL,                        // default security attributes 
        0,                           // use default stack size  
        FirstThread,                  // thread function 
        &AcceptSocket,                // argument to thread function 
        0,                           // use default creation flags 
        &dwThreadId);                // returns the thread identifier 
*/
	}
	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?