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

📄 back.cpp

📁 一个多方面查询的系统,也是很辛苦找到,并且做管理系统很多方面都用到的
💻 CPP
字号:
// back.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <Windows.h>
#include <stdio.h>
#include "mysql.h"
#include "fstream.h"


HANDLE db_Wevent;  //写数据库信号量

struct CONTROL_INFO
{
	int iDirection;
	int iStartNo;
	int iTransferForm;
	int iReturn;
	int iRecordcount;
	char cFilename[30];
	char cSqlstate[300];
};

struct TRANSFER_DATA
{
	char cMsg[15][300];
};


DWORD WINAPI ServerWorkerThread(LPVOID pParam);


int main(int argc, char* argv[])
{
	SOCKET m_ListenSocket;

	db_Wevent=CreateEvent(NULL,true,true,NULL); //初始化时能写


	WSADATA wsaData;
	SOCKADDR_IN InternetAddr;
	int Ret;
	if ((Ret = WSAStartup(0x0202,&wsaData)) != 0)
	{
      printf("WSAStartup failed with error %d\n", Ret);
      WSACleanup();
	}
	if ((m_ListenSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
	{ 
      printf("Failed to get a socket %d\n", WSAGetLastError());
	} 
	InternetAddr.sin_family = AF_INET;
    InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    InternetAddr.sin_port = htons(5100);
	if (bind(m_ListenSocket, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
	{ 
      printf("bind() failed with error %d\n", WSAGetLastError());
	} 
	if (listen(m_ListenSocket, 5))
	{ 
      printf("listen() failed with error %d\n", WSAGetLastError());
	} 


	if (CreateThread(NULL, 0, ServerWorkerThread, &m_ListenSocket, 0, 0) == NULL)
	{ 
      printf("CreateThread failed with error %d\n", GetLastError());
      return 0;
	}  


	while(true)
	{
		//使主线程不消失
		Sleep(10000000);
	}

	return 0;
}


DWORD WINAPI ServerWorkerThread(LPVOID lpParam)
{
	SOCKET *m_ListenSocket=(SOCKET *)lpParam;
	SOCKET AcceptSocket;
	MYSQL *db_handle,mysql;
	MYSQL_RES *query_result;
	MYSQL_ROW row;
	int db_error;
	int fieldcount;
	fstream *file;
	SYSTEMTIME sysTm;
	int i,j,iStart;

	AcceptSocket=accept(*m_ListenSocket,NULL,NULL);

	if (CreateThread(NULL, 0, ServerWorkerThread, m_ListenSocket, 0, 0) == NULL)
	{ 
      printf("CreateThread failed with error %d\n", GetLastError());
      return 0;
	}

	if(AcceptSocket==INVALID_SOCKET)
	{
		printf("INVALID_SOCKET");
		return 0;
	}

	db_handle=new MYSQL;
	mysql_init(&mysql);
	db_handle=mysql_real_connect(&mysql,"localhost","root","","test",0,NULL,0);

	
	CONTROL_INFO  *controlinfo=new CONTROL_INFO;
	TRANSFER_DATA *transferdata=new TRANSFER_DATA;
	
	int iExit=0;  //循环退出标志
	while(!iExit)
	{
		recv(AcceptSocket, (char *)controlinfo, sizeof(*controlinfo), 0);

		switch(controlinfo->iTransferForm)
		{
		case 0://将查询的结果数返回前台
			WaitForMultipleObjects(1,&db_Wevent,false,INFINITE);  //如果有写库操作,则不读
			db_error=mysql_query(db_handle,controlinfo->cSqlstate);
			if(db_error)
			{
				printf("query sql error");
				controlinfo->iRecordcount=0;
				fieldcount=0;
			}
			else
			{
				query_result=mysql_store_result(db_handle);
				controlinfo->iRecordcount=mysql_num_rows(query_result);
				fieldcount=mysql_field_count(db_handle);
			}

			//如果记录大于15,则将他们写入文件字符串AcceptSocket加上当前时间
			if(controlinfo->iRecordcount<15)
				controlinfo->iTransferForm=1;
			else
			{
				controlinfo->iTransferForm=2;

				::GetLocalTime(&sysTm);
				sprintf(controlinfo->cFilename,"temp/%d%d%d%d%d%d%d%d%s",AcceptSocket,sysTm.wYear,sysTm.wMonth,sysTm.wDay,sysTm.wHour,sysTm.wMinute,sysTm.wSecond,sysTm.wMilliseconds,".txt");
				file=new fstream;
				file->open(controlinfo->cFilename,ios::in|ios::out);
				
				char *cTemp=new char[300];
				memset(cTemp,' ',300);
				for(i=0;i<controlinfo->iRecordcount;i++) //将所有记录写入文件
				{
					file->seekg(i*300);  //因为每条记录为300个字节
					row=mysql_fetch_row(query_result);

					iStart=0;
   					for(j=0;j<fieldcount;j++)
					{
						iStart += sprintf( cTemp + iStart, "%s$", row[j] );
					}
					file->write(cTemp,300);
					file->flush();
				}
				delete cTemp;
			}

			send(AcceptSocket, (char *)controlinfo, sizeof(*controlinfo), 0);
			break;

		case 1://直接发送结果数据
			for(i=0;i<controlinfo->iRecordcount;i++) 
			{
				row=mysql_fetch_row(query_result);

				iStart=0;
   				for(j=0;j<fieldcount;j++)
				{
					iStart += sprintf(transferdata->cMsg[i]+ iStart, "%s$", row[j] );
				}
			}
			send(AcceptSocket, (char *)transferdata, sizeof(*transferdata), 0);

			break;

		case 2: //通过文件送结果
			if(controlinfo->iStartNo>controlinfo->iRecordcount||controlinfo->iStartNo<0)
				iExit=1;
			else
			{
				if(controlinfo->iStartNo+15<=controlinfo->iRecordcount)j=controlinfo->iStartNo+15;
				if(controlinfo->iStartNo+15>controlinfo->iRecordcount)j=controlinfo->iRecordcount;

				for(iStart=0,i=controlinfo->iStartNo;i<j;i++)
				{
					file->seekg(i*300);
					file->read(transferdata->cMsg[iStart],300);
					++iStart;
				}
				send(AcceptSocket, (char *)transferdata, 4500, 0);
			}

			break;

		case 3: //执行sql语句
			WaitForMultipleObjects(1,&db_Wevent,false,INFINITE);
			ResetEvent(db_Wevent);
			db_error=mysql_query(db_handle,controlinfo->cSqlstate);
			SetEvent(db_Wevent);

			if(db_error)
			{
				controlinfo->iReturn=0;
				printf("excute sql error");
			}
			else 
				controlinfo->iReturn=1;

			send(AcceptSocket, (char *)controlinfo, sizeof(*controlinfo), 0);

			break;

		case 4:
			iExit=1;
			break;
		}
    }


	if(lstrlen(controlinfo->cFilename)>0)
	{
		file->close();
		delete file;
		
		DeleteFile(controlinfo->cFilename);
	}
	if(controlinfo->iRecordcount>0)mysql_free_result(query_result);
	delete controlinfo;
	delete transferdata;
	mysql_close(db_handle);
	closesocket(AcceptSocket);

	return 1;
}


⌨️ 快捷键说明

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