计算机网络实验实验报告 联系客服

发布时间 : 星期六 文章计算机网络实验实验报告更新完毕开始阅读

// }

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;