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

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

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(\);

\