📄 completetionsock.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 + -