发布时间 : 星期六 文章计算机网络实验实验报告更新完毕开始阅读
// }
return TRUE;
return Run(Port, PersTO); bRun = TRUE;
CloseHandle(ThreadLaunchedEvent);
if(WaitForSingleObject(ThreadLaunchedEvent, THREADWAIT_TO) != WAIT_OBJECT_0) { }
//LogMessage(LOGFILENAME, \CloseHandle(ThreadLaunchedEvent); return FALSE; // 启动接收线程
ResetEvent(ThreadLaunchedEvent);
ThreadA = (HANDLE)_beginthreadex(NULL, 0, AcceptThread, this, 0, &ThreadA_ID); if(!ThreadA) { }
//LogMessage(LOGFILENAME, \return FALSE;
errno);
specified Timeout ->\
2. 关闭服务:
BOOL QHttpServer::Shutdown()
{
if(!bRun)
return FALSE;
BOOL bResult = TRUE; HANDLE hArray[2]; hArray[0] = ThreadA; hArray[1] = ThreadC; //
// 关闭接收和helper线程 //
SetEvent(ShutdownEvent);
DWORD n = WaitForMultipleObjects(2, hArray, TRUE, THREADKILL_TO);
}
if(n == WAIT_TIMEOUT || n == WAIT_FAILED) { }
CloseHandle(ThreadA); CloseHandle(ThreadC); //
// 所有的客户线程都结束 //
THREADLIST::iterator it; while(ThreadList.size()) { }
DeleteCriticalSection(&cs); DeleteCriticalSection(&_cs); bRun = FALSE; return bResult;
Sleep(100);
//LogMessage(LOGFILENAME, \ //if(!TerminateThread(ThreadA, THREADEXIT_SUCCESS))
//LogMessage(LOGFILENAME, \
already terminated\
//if(!TerminateThread(ThreadC, THREADEXIT_SUCCESS))
//LogMessage(LOGFILENAME, \
already terminated\
bResult = FALSE;
3. 增加新链接:
BOOL QHttpServer::AddClient(SOCKET s, char* clientAddress, int port)
{
VISVECTOR::iterator it;
it = find(Visitors.begin(), Visitors.end(), clientAddress);//查找重复IP if(it == Visitors.end()) { }
Visitors.push_back(clientAddress);//增加新客户IP visitsip.push_back(clientAddress);
//输出用
}
InterlockedIncrement(&Stats.nTotalHits);//互斥 ThreadTag threadTag; HANDLE unsigned int
//进入临界区并创建连接对象 EnterCriticalSection(&cs);
NewConnectionTag *NewConn = new NewConnectionTag; NewConn->pHttpServer NewConn->s if(hThread) { } else
serverlog.push_back(\);
//LogMessage(LOGFILENAME, \ //else
LeaveCriticalSection(&cs); return TRUE;
threadTag.threadID = threadID; threadTag.hThread = hThread; ThreadList.push_back(threadTag);
= this;
= s;
hThread; threadID;
hThread = (HANDLE)_beginthreadex(NULL, 0, ClientThread, NewConn, 0, &threadID);
4. 分析请求数据:
BOOL QHttpServer::ParseRequest(string szRequest, string &szResponse, BOOL &bKeepAlive)
{
string szMethod; string szFileName; string szFileExt;
string szStatusCode(\); string szContentType(\); string szConnectionType(\); string szNotFoundMessage; string szDateTime;
char pResponseHeader[2048]; fpos_t lengthActual = 0, length = 0; char *pBuf = NULL; int n; //
// 检查提交方法 //
n = szRequest.find(\, 0); if(n != string::npos) { } else { } //
// 分析链接类型 //
n = szRequest.find(\, 0); if(n != string::npos) //
// 分析内容类型 //
bKeepAlive = TRUE; return FALSE;
szMethod = szRequest.substr(0, n); if(szMethod == \) { } else { }
szStatusCode = \; szFileName = ERROR501; //
// 获取文件名 //
int n1 = szRequest.find(\, n + 1); if(n != string::npos) { } else { }
return FALSE;
szFileName = szRequest.substr(n + 1, n1 - n - 1); if(szFileName == \) { }
szFileName = m_DefIndex;