发布时间 : 星期六 文章计算机网络实验实验报告更新完毕开始阅读
int nPointPos = szFileName.rfind(\); if(nPointPos != string::npos) { }
//得到目前的时间 //
char szDT[128]; struct tm *newtime; time_t ltime; time(<ime);
newtime = gmtime(<ime); strftime(szDT, 128, //
// 读取文件 // FILE *f;
f = fopen((m_HomeDir + szFileName).c_str(), \); if(f != NULL) {
// 获得文件大小 fseek(f, 0, SEEK_END); fgetpos(f, &lengthActual); fseek(f, 0, SEEK_SET);
pBuf = new char[lengthActual + 1]; length = fread(pBuf, 1, lengthActual, f); fclose(f); //
// 返回响应 //
sprintf(pResponseHeader, \
\, newtime);
szFileExt = szFileName.substr(nPointPos + 1, szFileName.size()); strlwr((char*)szFileExt.c_str()); MIMETYPES::iterator it; it = MimeTypes.find(szFileExt); if(it != MimeTypes.end())
szContentType = (*it).second;
bytes\\r\\nContent-Length: %d\\r\\nConnection: %s\\r\\nContent-Type: %s\\r\\n\\r\\n\,
}
} else { }
szStatusCode.c_str(), szDT, SERVERNAME, (int)length, bKeepAlive ? \ :
\, szContentType.c_str());
//
// 如果文件没有找到 //
f = fopen((m_HomeDir + ERROR404).c_str(), \); if(f != NULL) { }
szStatusCode = \;
sprintf(pResponseHeader, \
szStatusCode.c_str(), szNotFoundMessage.size(), szDT, SERVERNAME, // 获取文件大小 fseek(f, 0, SEEK_END); fgetpos(f, &lengthActual); fseek(f, 0, SEEK_SET);
pBuf = new char[lengthActual + 1]; length = fread(pBuf, 1, lengthActual, f); fclose(f);
szNotFoundMessage = string(pBuf, length); delete pBuf; pBuf = NULL;
text/html\\r\\nDate: %s\\r\\nServer: %s\\r\\n\\r\\n%s\, szNotFoundMessage.c_str());
bKeepAlive = FALSE;
szResponse = string(pResponseHeader); if(pBuf)
szResponse += string(pBuf, length); delete pBuf; pBuf = NULL; return TRUE;
5. 多线程的实现:
UINT __stdcall QHttpServer::AcceptThread(LPVOID pParam)
{
QHttpServer *pHttpServer = (QHttpServer*)pParam; SOCKET s; // 主线程 WORD wVersionRequested;
WSADATA wsaData; sockaddr_in saLocal; WSAEVENT Handles[2]; WSANETWORKEVENTS sockaddr ClientAddr;
INT addrlen = sizeof(ClientAddr); sockaddr_in sain; char cAddr[50]; int result;
saLocal.sin_family saLocal.sin_port
= AF_INET;
= htons(pHttpServer->ServerPort);
NetworkEvents;
saLocal.sin_addr.s_addr = INADDR_ANY;//(ULONG)(pHttpServer->ipcon); wVersionRequested = MAKEWORD(2, 2);
result = WSAStartup(wVersionRequested, &wsaData); if(result != 0) { } if( { }
s = WSASocket(AF_INET, SOCK_STREAM, 0, (LPWSAPROTOCOL_INFO)NULL, 0, if(s == INVALID_SOCKET) {
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\); pHttpServer->CleanupThread(NULL, NULL, NULL); return THREADEXIT_SUCCESS;
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\); pHttpServer->CleanupThread(NULL, NULL, NULL); return THREADEXIT_SUCCESS; LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\); return THREADEXIT_SUCCESS;
result);
\
WSA_FLAG_OVERLAPPED);
WSAGetLastError());
} // // //
result = bind(s, (struct sockaddr *)&saLocal, sizeof(saLocal)); if(result == SOCKET_ERROR) { } // // //
result = listen(s, SOMAXCONN); if(result == SOCKET_ERROR) { }
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\); pHttpServer->CleanupThread(NULL, NULL, s); return THREADEXIT_SUCCESS; 侦听
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\); pHttpServer->CleanupThread(NULL, NULL, s); return THREADEXIT_SUCCESS; 绑定
WSAGetLastError());
WSAGetLastError());
pHttpServer->ShutdownEvent = WSACreateEvent();
if(pHttpServer->ShutdownEvent == WSA_INVALID_EVENT) { }
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\); pHttpServer->CleanupThread(NULL, NULL, NULL, s); return THREADEXIT_SUCCESS;
ShutdownEvent\
//创建事件
WSAEVENT Event = WSACreateEvent(); if(Event == WSA_INVALID_EVENT) {
//pHttpServer->LogMessage(LOGFILENAME, \serverlog.push_back(\);
\