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

📄 completetionsock.cpp

📁 大文件管理
💻 CPP
字号:
#include "syscontrol.h"

const int iBufferLength = sizeof(SOCKADDR_IN) + 16;
GUID GUIDName = WSAID_ACCEPTEX;
BOOL (PASCAL FAR *gpulFun)(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED);	//用来存放AcceptEx的句柄

/***************************************************************
函数功能:创建完成端口平台
参数:	  要调用这个平台的Cache
过程:
		首先根据用户对该平台的调用,计算出应用所需要的重叠结构的数量
		创建该平台的控制事件,可以从其他函数中控制该平台的结束,平台
		的控制由Cache的hEndEvent时间控制。同时启动该完成端口平台对应
		的操作线程。
***************************************************************/
HANDLE CreateCompletionPortThread(void *pParam)
{
	DWORD dwReturn;
	SYSCONFIG *SysConfig = (SYSCONFIG*)pParam;
	if(SysConfig->szExitStatus == 1)
		return NULL;
	SysConfig->szExitStatus = 1;
	//计算需要的缓冲队列的大小
	//创建缓存队列
	SysConfig->ppcOverLapped = new OVERLAPPEDPLUS*[SysConfig->lListSize];
	//创建线程控制事件
	SysConfig->hEndEvent = CreateEvent(0, TRUE, FALSE, 0);
	if(SysConfig->hEndEvent == NULL)
	{
		delete SysConfig->ppcOverLapped;
		SysConfig->szExitStatus = 0;
		return NULL;
	}
	//创建完成端口
	SysConfig->hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
	if(SysConfig->hCompletionPort == NULL)
	{
		delete SysConfig->ppcOverLapped;
		CloseHandle(SysConfig->hEndEvent);
		SysConfig->szExitStatus = 0;
		return NULL;
	}
	long i;
	for(i=0;i<SysConfig->lListSize;i++)
	{
		DWORD dwTempThreadID;
		HANDLE hTempThreadHandle;		
		hTempThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SocketDisposeThread, SysConfig, 0, &dwTempThreadID);
		if(hTempThreadHandle)
		{
			SysConfig->lWorkThreadNum++;
			CloseHandle(hTempThreadHandle);
		}
	}
	if(SysConfig->lWorkThreadNum == 0)
	{
		SysConfig->szExitStatus = 0;
		delete SysConfig->ppcOverLapped;
		CloseHandle(SysConfig->hEndEvent);
		SysConfig->szExitStatus = 0;
		return NULL;
	}

	if(CreateQueryListenSocket(SysConfig))
		return NULL;
	if(WSAIoctl(SysConfig->sListen, SIO_GET_EXTENSION_FUNCTION_POINTER, &GUIDName, sizeof(GUIDName),
		     &gpulFun, sizeof(gpulFun), &dwReturn, NULL, NULL))
		return NULL;
	CreateIoCompletionPort((HANDLE)SysConfig->sListen,SysConfig->hCompletionPort,0,0);
	SysConfig->lWorkThreadNum = 0;
	//创建完成端口处理线程
	for(i=0;i<SysConfig->lListSize;i++)
	{
		SysConfig->ppcOverLapped[i] = new OVERLAPPEDPLUS;
		memset(SysConfig->ppcOverLapped[i],0,sizeof(OVERLAPPEDPLUS));
		SysConfig->ppcOverLapped[i]->iOpCode1 = ACCEPTQUERY;
		StartBindOperator(SysConfig,SysConfig->ppcOverLapped[i]);
	}
	// 等待管理线程退出事件触发
	dwReturn = WaitForSingleObject(SysConfig->hEndEvent, INFINITE);
	long lResave = SysConfig->lListSize;
	for(i = 0; i < lResave; i++)
		PostQueuedCompletionStatus(SysConfig->hCompletionPort, 0, 1, NULL);
	long lSleepTime = 0;
	while(SysConfig->lWorkThreadNum>=0 && lSleepTime<1000)
	{
		lSleepTime++;
		Sleep(100);
	}
	SysConfig->lWorkThreadNum = 0;
	CloseHandle(SysConfig->hEndEvent);
	CloseHandle(SysConfig->hCompletionPort);
	if(SysConfig->ppcOverLapped)
	{
		for(i=0;i<SysConfig->lListSize;i++)
			delete []SysConfig->ppcOverLapped[i];
		delete []SysConfig->ppcOverLapped;
	}
	SysConfig->szExitStatus = 1;
	ExitThread(0);
	return SysConfig->hCompletionPort ;
}
void SocketDisposeThread(SYSCONFIG *SysConfig)
{
	int iReturn = 0;
	DWORD dwRetCount = 0;
	long lSendLen;
	DWORD dwCompKey = 0;
	OVERLAPPEDPLUS* pOl = NULL;
	long lTimeOut = 10000;//超时设置
	unsigned long lDocId;
	char *pPage = NULL;
	char *pStr = NULL;
	char szRev[160],ch;
	long lLen;
	while(1)
	{
		if(!GetQueuedCompletionStatus(SysConfig->hCompletionPort,&dwRetCount,&dwCompKey,(OVERLAPPED**)&pOl,INFINITE))
		{
			if(pOl)
			{
				closesocket(pOl->sClient);
				iReturn = StartBindOperator(SysConfig,pOl);
				if(iReturn)
				{
					if(iReturn != 1)
						closesocket(pOl->sClient);
					//绑定出错
				}
			}
		}
		//外表控制停止
		if(dwCompKey)
			break;
		switch(pOl->iOpCode1)
		{
		case ACCEPTQUERY://从外部已经接收了检索请求,进行处理
			setsockopt(pOl->sClient, SOL_SOCKET, SO_RCVTIMEO, (char*)&lTimeOut, sizeof(lTimeOut));
			setsockopt(pOl->sClient, SOL_SOCKET, SO_SNDTIMEO, (char*)&lTimeOut, sizeof(lTimeOut));
			lLen = recv(pOl->sClient,szRev,152,0);
			if(lLen != 152 || strncmp(szRev,"222211  ",8))
			{
				closesocket(pOl->sClient);
				iReturn = StartBindOperator(SysConfig,pOl);
				if(iReturn)
				{
					if(iReturn != 1)
						closesocket(pOl->sClient);
					//绑定出错
				}
				break;
			}
			ch = szRev[20];
			szRev[20] = 0;
			lDocId = atol(&szRev[8]);
			szRev[20] = ch;
			szRev[152] = 0;
			lLen = atol(&szRev[148]);
			if(lLen < 0 || lLen > 500) 
				break;
			pStr = new char[lLen+4];
			iReturn = recv(pOl->sClient,pStr,lLen,0);
			if(iReturn != lLen)
			{
				closesocket(pOl->sClient);
				iReturn = StartBindOperator(SysConfig,pOl);
				if(iReturn)
				{
					if(iReturn != 1)
						closesocket(pOl->sClient);
					//绑定出错
				}
				break;
			}
			pStr[lLen] = 0;
			if((lLen = SysConfig->pPhoto->SearchPhoto(lDocId,pStr,pPage))<=0)
			{
				delete pStr;
				closesocket(pOl->sClient);
				iReturn = StartBindOperator(SysConfig,pOl);
				if(iReturn)
				{
					if(iReturn != 1)
						closesocket(pOl->sClient);
					//绑定出错
				}
				break;
			}
			sprintf(szRev,"222212  %d       ",lLen);
/*			for(iReturn = 0;iReturn < lLen;iReturn++)
			{
				if(*(pPage+iReturn) == 0)
					*(pPage+iReturn) = ' ';
			}
*/			lSendLen = 0;
			do
			{
				iReturn = send(pOl->sClient,szRev+lSendLen,16-lSendLen,0);
				if(iReturn > 0)
					lSendLen += iReturn;
			}while(iReturn >= 0 && lSendLen < 16);
			if(lSendLen != 16)
			{
				delete pStr;
				delete pPage;
				closesocket(pOl->sClient);
				iReturn = StartBindOperator(SysConfig,pOl);
				if(iReturn)
				{
					if(iReturn != 1)
						closesocket(pOl->sClient);
					//绑定出错
				}
				break;
			}
			lSendLen = 0;
			do
			{
				iReturn = send(pOl->sClient,pPage+lSendLen,lLen-lSendLen,0);
				if(iReturn > 0)
					lSendLen += iReturn;
			}while(iReturn >= 0 && lSendLen < lLen);
			delete pStr;
			delete pPage;
			closesocket(pOl->sClient);
			iReturn = StartBindOperator(SysConfig,pOl);
			if(iReturn)
			{
				if(iReturn != 1)
					closesocket(pOl->sClient);
				//绑定出错
			}
			break;
		default:
			break;
		}
	}
	return;	
}
long ClearDir(char *pszDir)
{
	struct _finddata_t find_file;
	long hFile;
	char aFileName[400];

	sprintf(aFileName, "%s\\*.*", pszDir);
	if((hFile = _findfirst(aFileName, &find_file)) == -1)
		return 0;
	do
	{
		sprintf(aFileName, "%s\\%s", pszDir, find_file.name);
		if(strcmp(find_file.name, ".") && strcmp(find_file.name, ".."))
		{
			if(find_file.attrib & _A_SUBDIR)			
			{
				ClearDir(aFileName);
				rmdir(aFileName);
			}
			else 
				remove(aFileName);
		}
	}while(_findnext(hFile,&find_file) != -1);
	_findclose(hFile);
	rmdir(pszDir);
	return 0;
}
/*******************************************************************
函数功能:对各种不同功能的通信方式进行与重叠结构的绑定
参数:pCache:cache
	  pOl:要绑定的重叠结构
*******************************************************************/
long StartBindOperator(SYSCONFIG *SysConfig,OVERLAPPEDPLUS * pOl)
{
//	memset(pOl, 0, sizeof(OVERLAPPEDPLUS));
	DWORD dwReturn = 0;
	pOl->sClient = socket(AF_INET, SOCK_STREAM, 0);
	if(pOl->sClient == INVALID_SOCKET)
		return 1;
	memset(&pOl->cOverlapped,0,sizeof(OVERLAPPED));
	switch(pOl->iOpCode1)
	{
	case ACCEPTQUERY:
		//Com接收侦听启动AcceptEx
		if(!(gpulFun(SysConfig->sListen,pOl->sClient,pOl->szaBuffer,0,iBufferLength,iBufferLength,&dwReturn,(OVERLAPPED *)&pOl->cOverlapped)))
		{
			if(WSAGetLastError() != ERROR_IO_PENDING) return -1;
		}
		break;
	default:
		break;
	}
	return 0;
}
void AddPhotoThread(void *pParam)
{
	SYSCONFIG* SysConfig = (SYSCONFIG *)pParam;
	char filename[10][300];
	char filename1[512];
	char buf[512];
	char cFlag;	
	unsigned long lDocId;
	long lLen,lRet;
	char *p,*p1;
	FILE *fp1,*fp2,*fp3;
	char *pPage = new char[1048576];
	sprintf(filename1,"%s\\parseposition.txt",SysConfig->pPhoto->syspath);
	fp1 = fopen(filename1,"r");
	if(fp1 == NULL)
	{
		for(lLen = 0;lLen < 10;lLen++)
			SysConfig->szNowFileName[lLen][0] = 0;
	}
	else
	{
		for(lLen = 0;lLen < 10 ;lLen++)
		{
			fgets(SysConfig->szNowFileName[lLen],300,fp1);
			p = SysConfig->szNowFileName[lLen];
			lRet = strlen(p)-1;
			while(p[lRet] == ' ' || p[lRet] == (char)0x0d || p[lRet] == (char)0x0a || p[lRet] == '\t')
				lRet--;
			p[lRet+1] = 0;
		}
		fclose(fp1);
	}
	struct stat st;
	sprintf(filename1,"%s\\%s",SysConfig->pPhoto->syspath,PHOTODIRLISTFILE);
	lRet = strlen(filename1)-5;
	for(lLen = 0;lLen < 10;lLen++)
	{
		strcpy(filename[lLen],filename1);
		filename[lLen][lRet] =(char)('0'+lLen);
	}
//	char logfile[300];
//	sprintf(logfile,"%s\\%s",SysConfig->pPhoto->syspath,"log.txt");
//	FILE *fpLog = fopen(logfile,"at");
//	if(fpLog == NULL)
//		return;
	long lLastTime[10];
	memset(lLastTime,0,40);
	long i,j;
	for(i=0;i<10;i++)
	{
		printf("filename[%d] = %s\n",i,filename[i]);
		printf("szNowFileName[%d] = %s\n",i,SysConfig->szNowFileName[i]);
	}
	while(SysConfig->szPhotoAddFlag)
	{
		for(i=0;i<10;i++)
		{
			if(access(filename[i],0))
				continue;
			else
			{
				stat(filename[i],&st);
				if(st.st_mtime == lLastTime[i])
					continue;
				break;
			}
		}
		if(i == 10)
		{
			Sleep(100);
			continue;
		}
		lLastTime[i] = st.st_mtime;
		fp1 = fopen(filename[i],"r");
		if(SysConfig->szNowFileName[i][0])
		{
			while(fgets(buf,300,fp1))
			{
				lLen = strlen(buf)-1;
				while(lLen >= 0 &&(buf[lLen] == (char)0x0d || buf[lLen] == (char)0x0a
						|| buf[lLen] == ' ' || buf[lLen] == '/' || buf[lLen] == '\\')) lLen --;
				buf[lLen+1] = 0;
				p1 = strchr(buf,'$');
				if(p1 == NULL)
					p1 = buf;
				else
				{
					*p1 = ':';
					if(p1>buf)
						p1--;
				}
				if(strcmp(p1,SysConfig->szNowFileName[i]) == 0)
					break;
			}
		}
		while(fgets(buf,300,fp1))
		{
			lLen = strlen(buf)-1;
			while(lLen >= 0 &&(buf[lLen] == (char)0x0d || buf[lLen] == (char)0x0a
					|| buf[lLen] == ' ' || buf[lLen] == '/' || buf[lLen] == '\\')) lLen --;
			buf[lLen+1] = 0;
			p1 = strchr(buf,'$');
			if(p1 == NULL)
				p1 = buf;
			else
			{
				*p1 = ':';
				if(p1>buf)
					p1--;
			}
			if(access(p1,0)) continue;
			strcpy(SysConfig->szNowFileName[i],p1);
			sprintf(filename1,"%s\\%s",p1,DETAILPHOTOFILELIST);
			fp2 = fopen(filename1,"r");
			if(fp2 == NULL) continue;
			while(fgets(buf,500,fp2))
			{
				lLen = strlen(buf)-1;
				while(lLen >= 0 &&(buf[lLen] == (char)0x0d || buf[lLen] == (char)0x0a
						|| buf[lLen] == ' ' || buf[lLen] == '/' || buf[lLen] == '\\')) lLen --;
				buf[lLen+1] = 0;
//				ChangePath(buf);
				p = strchr(buf,'$');
				if(p)
				{
					*p = ':';
					if(p1>buf)
						p--;
				}
				else
					p = buf;
				if(access(p,0)) continue;
				fp3 = fopen(p,"rb");
				if(fp3 == NULL) continue;
				printf("%s\n",p);
				while(1)
				{
					if(fread(&lDocId,4,1,fp3) != 1)	break;
					if(fread(&cFlag,1,1,fp3) != 1) break;
					if(cFlag == 0)
					{
						SysConfig->pPhoto->DelPhoto(1,&lDocId);
						continue;
					}
					if(fread(&lLen,4,1,fp3) != 1) break;
					long lLen1 = fread(pPage,1,lLen,fp3);
					if(lLen1 != lLen) break;
					if(cFlag == 2)
						lRet = SysConfig->pPhoto->DelPhoto(1,&lDocId);
					lRet = SysConfig->pPhoto->AddPhoto(1,&lDocId,&lLen,pPage);
				}
				fclose(fp3);
			}
			fclose(fp2);			SysConfig->pPhoto->SaveSys();
			sprintf(buf,"%s\\parseposition.txt",SysConfig->pPhoto->syspath);
			fp2 = fopen(buf,"w");
			if(fp2)
			{
				for(j=0;j<10;j++)
				{
					fprintf(fp2,"%s\n",SysConfig->szNowFileName[j]);
				}
				fclose(fp2);
				fp2 = NULL;
			}
			ClearDir(SysConfig->szNowFileName[i]);
		}
		fclose(fp1);
		Sleep(1000);
	}
	delete pPage;
}
long CreateQueryListenSocket(SYSCONFIG *SysConfig)
{
	WSADATA cWSAData;
	SOCKADDR_IN cListenAddr;
	if(WSAStartup(MAKEWORD(2, 2), &cWSAData)) 
		return -1;
	
	SysConfig->sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	if(SysConfig->sListen == INVALID_SOCKET)
	{
		WSACleanup();
		return -1;
	}
	
	cListenAddr.sin_family = AF_INET;
	cListenAddr.sin_addr.s_addr = 0;
	cListenAddr.sin_port = htons(SysConfig->sPort);
	
	if(bind(SysConfig->sListen, (struct sockaddr*)&cListenAddr, sizeof(cListenAddr)) == SOCKET_ERROR)
	{
		DWORD dwRet = GetLastError();
		closesocket(SysConfig->sListen);
		WSACleanup();			
		return -1;
	}
	if(listen(SysConfig->sListen, SOMAXCONN) == SOCKET_ERROR) 
	{
		DWORD dwRet = GetLastError();
		closesocket(SysConfig->sListen);
		WSACleanup();
		return -1;
	}
	return 0;
	
}
long GetNewFileList(char *filename,QuickPhoto *pPhoto,char *pDescription)
{
	FILE *fp = fopen(filename,"r");
	if(fp == NULL)
	{
		sprintf(pDescription,"列表文件%s不能打开!\n",filename);
		return -1;
	}
	long lLen;
	char buf[512];
	char *p;
	long lSize;
	long lRet;
long lLoop = 0;
	while(fgets(buf,500,fp))
	{
printf("%d\n",++lLoop);
		p = strchr(buf,'|');
		if(p)
		{
			lSize = atol(p+1);
			*p = 0;
		}
		else
			lSize = 2000;
		lLen = strlen(buf)-1;
		while(lLen >= 0 &&(buf[lLen] == (char)0x0d || buf[lLen] == (char)0x0a
				|| buf[lLen] == ' ' || buf[lLen] == '/' || buf[lLen] == '\\')) lLen --;
		buf[lLen+1] = 0;
		if(access(buf,0)==0)
		{
			sprintf(pDescription,"列表文件中的 %s 已经存在!\n",buf);
			fclose(fp);
			return -1;
		}
		lRet = pPhoto->AddFileToFileList(buf,lSize);
		if(lRet < 0)
		{
			sprintf(pDescription,"失败,请确认系统文件总数是否超过60000,或者每一个文件的路径是否存在,或者文件大小设置错误,或者硬盘空间不够!\n");
			fclose(fp);
			return -1;
		}
	}
	fclose(fp);
	pPhoto->SaveSys();
	return 0;
}

⌨️ 快捷键说明

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