18,356
社区成员
发帖
与我相关
我的任务
分享
typedef struct _FileInfo
{
TCHAR szFileName[MAX_PATH];
DWORD dwFileID;
TCHAR cFileFlag;
TCHAR cFileType;
FILETIME ftLastWriteTime;
DWORD dwFileSizeHigh;
DWORD dwFileSizeLow;
DWORD dwFileCrc;
}FileInfo,*PFileInfo;
DWORD WINAPI CIOCPServer::_WorkerThreadProc(LPVOID lpParam)
{
CIOCPServer *pThis = (CIOCPServer*)lpParam;
PIOCP_BUF pBuffer;
PIOCP_CONTEXT pContext;
DWORD dwTrans = 0;
LPOVERLAPPED lpol;
BOOL bOK;
while (TRUE)
{
// ……………………
bOK = GetQueuedCompletionStatus(pThis->m_hCompletion,&dwTrans,(LPDWORD)&pContext,&lpol,WSA_INFINITE);
// 错误处理
pThis->HandleIO( pContext, pBuffer, dwTrans, nError );
}
return 0;
}
void CIOCPServer::HandleIO(PIOCP_CONTEXT pConTextKey, PIOCP_BUF pBuffer, DWORD dwTrans, int nError)
{
PIOCP_CONTEXT pContext;
pContext=pConTextKey;
if(pContext != NULL && (unsigned int )pContext != 0xfeeefeee )
{
if(pBuffer->IoOper == IoRecv)
::InterlockedDecrement(&pContext->nOutstandingRecv);
else if(pBuffer->IoOper == IoWrite)
::InterlockedDecrement(&pContext->nOutstandingSend);
}
if ( pBuffer != NULL && (unsigned int)pBuffer != 0xfeeefeee )
{
switch(pBuffer->IoOper)
{
// 其他无关代码省略…………
case IoRecv:
pContext=pConTextKey;
if (pContext == NULL || pBuffer == NULL)
break;
EnterCriticalSection(&pContext->Lock);
SendFileStructEx(pContext,pBuffer,pContext->sCurOption, _T("0102"));
LeaveCriticalSection(&pContext->Lock);
break;
case IoWrite:
pContext=pConTextKey;
EnterCriticalSection(&pContext->Lock);
pContext->sIsPostSend=0;//发送包完成
pContext->nSendCount+=dwTrans;
if (pContext->nSendCount = pBuffer->nBufLen)
{
pContext->nSendCount=0;
}
if( _tcsnccmp(pBuffer->pBuf+4, _T("0102"),4)==0 )
{
INT64 i64t=pContext->i64TotalByte - pContext->i64HavedByte;
if (i64t != 0 )
{
if( i64t < pBuffer->nBufLen - 12)
{
pBuffer->nBufLen = (int)(i64t + 12);
}
memcpy(pBuffer->pBuf+12,pContext->pPoint+pContext->i64HavedByte,pBuffer->nBufLen-12);
pContext->i64HavedByte+=pBuffer->nBufLen-12;
*(int*)pBuffer->pBuf=pBuffer->nBufLen-4;
if (!PostSend(pContext,pBuffer))
{
LeaveCriticalSection(&pContext->Lock);
return;
}
}
else
{
if (pContext->pPoint != NULL && pContext->bFree == FALSE)
{
free(pContext->pPoint);
pContext->pPoint=NULL;
}
}
}
LeaveCriticalSection(&pContext->Lock);
break;
default :
;
}
return ;
}
}
void CIOCPServer::SendFileStructEx(PIOCP_CONTEXT pContext,PIOCP_BUF pBuffer,TCHAR *sBrowserDir,TCHAR *sCmd)
{
u_long nTotalSize = 0;
int nFileCount = 0;
int nFileInfoSize = 0;
if (m_pFile == NULL)
{
return;
}
nFileInfoSize=sizeof(FileInfo);
int nFileIndex = 1;
BrowserFolderEx(sBrowserDir,&nFileCount,m_pFile,&m_pFile, nFileIndex ); //遍历目录
nFileIndex = 0;
nTotalSize=nFileCount*nFileInfoSize;
pContext->pPoint=(TCHAR*)m_pFile; // FileInfo 之前申请了一块内存
pContext->i64TotalByte=nTotalSize;
if(nTotalSize > BUFFER_SIZE -12)
nTotalSize=(BUFFER_SIZE -12)/nFileInfoSize*nFileInfoSize;
pContext->i64HavedByte=nTotalSize;
memset(&pBuffer->ol,0,sizeof(WSAOVERLAPPED));
pBuffer->ol.OffsetHigh = 0;
*(int*)(pBuffer->pBuf)=8+nTotalSize;
memcpy(pBuffer->pBuf+4,sCmd,4);
memcpy(pBuffer->pBuf+8,&nFileCount,4);
memcpy(pBuffer->pBuf+12,m_pFile,nTotalSize);
pBuffer->nBufLen=nTotalSize+12;
if (!PostSend(pContext,pBuffer))
{
LOG.LogF( _T("发送文件结构体信息失败 行号: %d 错误码: %d"), __LINE__,WSAGetLastError());
return;
}
PostRecv(pContext,pBuffer);
}