计算机网络实验实验报告_第1页
计算机网络实验实验报告_第2页
计算机网络实验实验报告_第3页
计算机网络实验实验报告_第4页
计算机网络实验实验报告_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华中科技大学计算机学院《计算机网络》试验汇报试验名称网络组建与实行及Socket编程团体组员:姓名班级学号奉献比例得分注:团体组员奉献比例之和为1教师评语:试验一——网络组建与实行环境操作系统:WINDOWS7(32位旗舰版)工具:BosonNetsim仿真软件(版本号5.31)试验目的理解IP协议,网络层协议和数据链路层协议的工作原理机以及工作机制掌握IP地址的规划措施掌握路由协议的配置措施掌握路由器以及二/三层互换机的配置措施理解VLAN的划分原理掌握访问控制的配制措施试验内容及环节(包括重要流程和阐明)试验所用拓扑图如下:图一:图二第一项试验——组网试验1.设置PC1、PC2的ip分别为、,子网掩码为,网关为54;设置PC3~PC8的ip分别为~,子网掩码为,网关为54;设置RouterA的端口地址为ether054,ether154。测试成果为各PC机之间可以自由通信,部提成果如图1-1所示。图1-1(a)图1-1(b)2.将PC4、PC6、PC8的ip地址改为、、,网关改为54,其他设置不变。PC4,PC6,PC8之间能互相通信,不能发送数据到其他PC;其他PC之间可以互相通信;PC1,PC2不能发送数据给PC4,PC6,PC8,而PC3,PC5,PC7可以发送数据给PC4,PC6,PC8。部提成果如图1-2所示。成果分析:路由器ip为PC3,PC5,PC7的默认网关,PC3,PC5,PC7可以通过路由器访问其他PC,也可以被PC1,PC2访问,而PC4,PC6,PC8无法通过路由器访问其他子网段PC图1-2(a)PC3的ping成果

图1-2(b)PC1的ping成果图1-2(c)PC4的ping成果第二项试验——路由配置试验1.首先按如下规定配置各PC的IP地址IP地址子网掩码默认网关PC154PC254PC354PC4542.路由器配置如下(RouterA配置如下,其他路由器配置类似)3.RIP协议配置(RouterA配置如下,其他路由器配置类似)思索题假如不设置时钟频率,各PC无法互相访问OSPF协议配置(RouterA配置如下,其他路由器配置类似)成果是各PC能互相访问,部提成果见图2-1。图3-1(a)PC2的ping成果第三项试验——VLAN划分试验在switch2,switch3,switch4上设置一种名为class的VTP域,并创立一种名为Class1的VLAN2以及名为Class2的VLAN3.将switch2,switch3,switch4的各个端口分派到新创立的对应VLAN中。(switch2的配置如下,switch3,switch4的配置与之类似,端口为fa0/3和fa0/4)配置switch2,switch3,switch4之间的trunk链路。(switch2的配置如下,switch3,switch4的配置与之类似,端口为fa0/1和fa0/2)此时,PC3,PC5,PC7处在VLAN2,PC4,PC6,PC8处在VLAN3,VLAN2和VLAN3内部PC可以互相访问,但VLAN之间无法访问。部提成果见图3-1。图3-1(a)PC3的ping成果图3-1(b)PC4的ping成果第四项试验——访问控制配置试验对路由器RouterA进行配置,使得PC1无法访问其他PC,也不能被其他PC访问部提成果见图4-1。图4-1(a)PC1的ping成果图4-1(b)PC2的ping成果试验二——支持多线程处理的web服务服务端软件环境操作系统:WINDOWS7(32位旗舰版)运行工具:chrome浏览器编写程序语言:C++环境:QtCreator5.1.0试验目的理解应用层和运送层的作用以及有关协议的工作原理和机制掌握SOCKET编程的基本措施试验内容及环节(包括重要流程和阐明)内容:编写一种支持多线程处理的web服务服务端软件规定如下:第一级:1.可配置Web服务器的IP地址、监听端口和主目录2.制作一种主页放在主目录中,并配置Web服务器的IP地址、监听端口和主目录3.具有完毕所需功能的基本图形顾客界面(GUI),并具友好性第二级:1.选择合适的Socket编程模型,创立套接字,监听所配置的监听端口2.支持服务的启动和关闭3.具有完毕所需功能的基本图形顾客界面(GUI),并具友好性第三级:支持多线程,可以针对每一种新的祈求创立新的线程在服务端的屏幕上输出每一种祈求的来源(IP地址、端口号和HTTP祈求命令行)支持一定的异常状况处理能力具有完毕所需功能的基本图形顾客界面(GUI),并具友好性第四级:可以处理HTTP祈求以及定位对应的HTML文献向客户端发送响应报文对于无法成功定位文献的祈求,根据错误原因,做对应的错误提醒在服务端的屏幕上可以输出对每一种祈求处理的成果具有完毕所需功能的基本图形顾客界面(GUI),并具友好性第五级:支持多种类型文献(如TXT和JPG等)的发送具有简洁以便的GUI界面环节:代码实现部分启动服务:BOOLQHttpServer::Start(stringHomeDir,stringDefIndex,intPort,intPersTO){ m_HomeDir =HomeDir; m_DefIndex =DefIndex; if(m_HomeDir.substr(m_HomeDir.size()-1,1)!="\\") m_HomeDir+="\\"; if(bRun) { //LogMessage(LOGFILENAME,"_beginthreadex(...)failure,forLaunchThread","Run",errno); returnFALSE; } ServerPort=Port; PersistenceTO=PersTO; InitializeCriticalSection(&cs); InitializeCriticalSection(&_cs); Reset(); ThreadLaunchedEvent =CreateEvent(NULL,FALSE,TRUE,NULL); //启动接受线程 ResetEvent(ThreadLaunchedEvent); ThreadA=(HANDLE)_beginthreadex(NULL,0,AcceptThread,this,0,&ThreadA_ID); if(!ThreadA) { //LogMessage(LOGFILENAME,"_beginthreadex(...)failure,forLaunchThread","Run",errno); returnFALSE; } if(WaitForSingleObject(ThreadLaunchedEvent,THREADWAIT_TO)!=WAIT_OBJECT_0) { //LogMessage(LOGFILENAME,"UnabletogetresponsefromAcceptThreadwithingspecifiedTimeout->","Run",THREADWAIT_TO); CloseHandle(ThreadLaunchedEvent); returnFALSE; } CloseHandle(ThreadLaunchedEvent); bRun=TRUE; returnTRUE;// returnRun(Port,PersTO);}关闭服务:BOOLQHttpServer::Shutdown(){ if(!bRun) returnFALSE; BOOLbResult=TRUE; HANDLE hArray[2]; hArray[0]=ThreadA; hArray[1]=ThreadC; // //关闭接受和helper线程 // SetEvent(ShutdownEvent); DWORDn=WaitForMultipleObjects(2,hArray,TRUE,THREADKILL_TO); if(n==WAIT_TIMEOUT||n==WAIT_FAILED) { //LogMessage(LOGFILENAME,"WaitForMultipleObjects(...)timedout","Shutdown"); //if(!TerminateThread(ThreadA,THREADEXIT_SUCCESS)) //LogMessage(LOGFILENAME,"TerminateThread(.ThreadA.)failure,probablyitisalreadyterminated","Shutdown",GetLastError()); //if(!TerminateThread(ThreadC,THREADEXIT_SUCCESS)) //LogMessage(LOGFILENAME,"TerminateThread(.ThreadC.)failure,probablyitisalreadyterminated","Shutdown",GetLastError()); bResult=FALSE; } CloseHandle(ThreadA); CloseHandle(ThreadC); // //所有的客户线程都结束 // THREADLIST::iteratorit; while(ThreadList.size()) { Sleep(100); } DeleteCriticalSection(&cs); DeleteCriticalSection(&_cs); bRun=FALSE; returnbResult;}增长新链接:BOOLQHttpServer::AddClient(SOCKETs,char*clientAddress,intport){ VISVECTOR::iteratorit; 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 hThread; unsignedint threadID; //进入临界区并创立连接对象 EnterCriticalSection(&cs); NewConnectionTag*NewConn =newNewConnectionTag; NewConn->pHttpServer =this; NewConn->s =s; hThread=(HANDLE)_beginthreadex(NULL,0,ClientThread,NewConn,0,&threadID); if(hThread) { threadTag.threadID=threadID; threadTag.hThread=hThread; ThreadList.push_back(threadTag); } else serverlog.push_back("_beginthreadex(...)failure"); //else //LogMessage(LOGFILENAME,"_beginthreadex(...)failure","AddClient",errno); LeaveCriticalSection(&cs); returnTRUE;}分析祈求数据:BOOLQHttpServer::ParseRequest(stringszRequest,string&szResponse,BOOL&bKeepAlive){ stringszMethod; stringszFileName; stringszFileExt; stringszStatusCode("200OK"); stringszContentType("text/html"); stringszConnectionType("close"); stringszNotFoundMessage; stringszDateTime; charpResponseHeader[2048]; fpos_tlengthActual=0,length=0; char*pBuf=NULL; intn; // //检查提交措施 // n=szRequest.find("",0); if(n!=string::npos) { szMethod=szRequest.substr(0,n); if(szMethod=="GET") { // //获取文献名 // intn1=szRequest.find("",n+1); if(n!=string::npos) { szFileName=szRequest.substr(n+1,n1-n-1); if(szFileName=="/") { szFileName=m_DefIndex; } } else { returnFALSE; } } else { szStatusCode="501NotImplemented"; szFileName=ERROR501; } } else { returnFALSE; } // //分析链接类型 // n=szRequest.find("\nConnection:Keep-Alive",0); if(n!=string::npos) bKeepAlive=TRUE; // //分析内容类型 // intnPointPos=szFileName.rfind("."); if(nPointPos!=string::npos) { szFileExt=szFileName.substr(nPointPos+1,szFileName.size()); strlwr((char*)szFileExt.c_str()); MIMETYPES::iteratorit; it=MimeTypes.find(szFileExt); if(it!=MimeTypes.end()) szContentType=(*it).second; } //得到目前的时间 // charszDT[128]; structtm*newtime; time_tltime; time(<ime); newtime=gmtime(<ime); strftime(szDT,128, "%a,%d%b%Y%H:%M:%SGMT",newtime); // //读取文献 // FILE*f; f=fopen((m_HomeDir+szFileName).c_str(),"r+b"); if(f!=NULL) { //获得文献大小 fseek(f,0,SEEK_END); fgetpos(f,&lengthActual); fseek(f,0,SEEK_SET); pBuf=newchar[lengthActual+1]; length=fread(pBuf,1,lengthActual,f); fclose(f); // //返回响应 // sprintf(pResponseHeader,"HTTP/1.0%s\r\nDate:%s\r\nServer:%s\r\nAccept-Ranges:bytes\r\nContent-Length:%d\r\nConnection:%s\r\nContent-Type:%s\r\n\r\n", szStatusCode.c_str(),szDT,SERVERNAME,(int)length,bKeepAlive?"Keep-Alive":"close",szContentType.c_str()); } else { // //假如文献没有找到 // f=fopen((m_HomeDir+ERROR404).c_str(),"r+b"); if(f!=NULL) { //获取文献大小 fseek(f,0,SEEK_END); fgetpos(f,&lengthActual); fseek(f,0,SEEK_SET); pBuf=newchar[lengthActual+1]; length=fread(pBuf,1,lengthActual,f); fclose(f); szNotFoundMessage=string(pBuf,length); deletepBuf; pBuf=NULL; } szStatusCode="404Resourcenotfound"; sprintf(pResponseHeader,"HTTP/1.0%s\r\nContent-Length:%d\r\nContent-Type:text/html\r\nDate:%s\r\nServer:%s\r\n\r\n%s", szStatusCode.c_str(),szNotFoundMessage.size(),szDT,SERVERNAME,szNotFoundMessage.c_str()); bKeepAlive=FALSE; } szResponse=string(pResponseHeader); if(pBuf) szResponse+=string(pBuf,length); deletepBuf; pBuf=NULL; returnTRUE;}多线程的实现:UINT__stdcallQHttpServer::AcceptThread(LPVOIDpParam){ QHttpServer*pHttpServer=(QHttpServer*)pParam; SOCKETs;//主线程 WORDwVersionRequested; WSADATAwsaData; sockaddr_insaLocal; WSAEVENTHandles[2]; WSANETWORKEVENTS NetworkEvents; sockaddrClientAddr; INTaddrlen=sizeof(ClientAddr); sockaddr_insain; charcAddr[50]; intresult; saLocal.sin_family =AF_INET; saLocal.sin_port =htons(pHttpServer->ServerPort); saLocal.sin_addr.s_addr=INADDR_ANY;//(ULONG)(pHttpServer->ipcon); wVersionRequested=MAKEWORD(2,2); result=WSAStartup(wVersionRequested,&wsaData); if(result!=0) { //pHttpServer->LogMessage(LOGFILENAME,"WSAStartup(...)failure","AcceptThread",result); serverlog.push_back("WSAStartup(...)failure"); returnTHREADEXIT_SUCCESS; } if( LOBYTE(wsaData.wVersion)!=2|| HIBYTE(wsaData.wVersion)!=2) { //pHttpServer->LogMessage(LOGFILENAME,"RequestedSocketversionnotexist","AcceptThread"); serverlog.push_back("RequestedSocketversionnotexist"); pHttpServer->CleanupThread(NULL,NULL,NULL); returnTHREADEXIT_SUCCESS; } s=WSASocket(AF_INET,SOCK_STREAM,0,(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED); if(s==INVALID_SOCKET) { //pHttpServer->LogMessage(LOGFILENAME,"WSASocket(...)failure","AcceptThread",WSAGetLastError()); serverlog.push_back("WSASocket(...)failure"); pHttpServer->CleanupThread(NULL,NULL,NULL); returnTHREADEXIT_SUCCESS; } // // 绑定 // result=bind(s,(structsockaddr*)&saLocal,sizeof(saLocal)); if(result==SOCKET_ERROR) { //pHttpServer->LogMessage(LOGFILENAME,"bind(...)failure","AcceptThread",WSAGetLastError()); serverlog.push_back("bind(...)failure"); pHttpServer->CleanupThread(NULL,NULL,s); returnTHREADEXIT_SUCCESS; } // // 侦听 // result=listen(s,SOMAXCONN); if(result==SOCKET_ERROR) { //pHttpServer->LogMessage(LOGFILENAME,"listen(...)failure","AcceptThread",WSAGetLastError()); serverlog.push_back("listen(...)failure"); pHttpServer->CleanupThread(NULL,NULL,s); returnTHREADEXIT_SUCCESS; } pHttpServer->ShutdownEvent=WSACreateEvent(); if(pHttpServer->ShutdownEvent==WSA_INVALID_EVENT) { //pHttpServer->LogMessage(LOGFILENAME,"WSACreateEvent(...)failureforShutdownEvent","AcceptThread",WSAGetLastError()); serverlog.push_back("WSACreateEvent(...)failureforShutdownEvent"); pHttpServer->CleanupThread(NULL,NULL,NULL,s); returnTHREADEXIT_SUCCESS; } //创立事件 WSAEVENTEvent=WSACreateEvent(); if(Event==WSA_INVALID_EVENT) { //pHttpServer->LogMessage(LOGFILENAME,"WSACreateEvent(...)failureforEvent","AcceptThread",WSAGetLastError()); serverlog.push_back("WSACreateEvent(...)failureforEvent"); pHttpServer->CleanupThread(NULL,pHttpServer->ShutdownEvent,s); returnTHREADEXIT_SUCCESS; } Handles[0]=pHttpServer->ShutdownEvent; Handles[1]=Event; result=WSAEventSelect(s,Event,FD_ACCEPT); if(result==SOCKET_ERROR) { //pHttpServer->LogMessage(LOGFILENAME,"WSAEventSelect(...)failure","AcceptThread",WSAGetLastError()); serverlog.push_back("WSAEventSelect(...)failure"); pHttpServer->CleanupThread(Event,pHttpServer->ShutdownEvent,s); returnTHREADEXIT_SUCCESS; } SetEvent(pHttpServer->ThreadLaunchedEvent); for(;;) { DWORDEventCaused=WSAWaitForMultipleEvents( 2, Handles, FALSE, WSA_INFINITE, FALSE); if(EventCaused==WAIT_FAILED||EventCaused==WAIT_OBJECT_0) { if(EventCaused==WAIT_FAILED) { serverlog.push_back("WaitForMultipleObjects(...)failure"); } //pHttpServer->LogMessage(LOGFILENAME,"WaitForMultipleObjects(...)failure","AcceptThread",GetLastError()); pHttpServer->CleanupThread(Event,pHttpServer->ShutdownEvent,s); returnTHREADEXIT_SUCCESS; } result=WSAEnumNetworkEvents( s, Event, &NetworkEvents); if(result==SOCKET_ERROR) { //pHttpServer->LogMessage(LOGFILENAME,"WSAEnumNetworkEvents(...)failure","AcceptThread",WSAGetLastError()); serverlog.push_back("WSAEnumNetworkEvents(...)failure"); pHttpServer->CleanupThread(Event,pHttpServer->ShutdownEvent,s); returnTHREADEXIT_SUCCESS; } if(NetworkEvents.lNetworkEvents==FD_ACCEPT) { SOCKETClientSocket=WSAAccept(s,&ClientAddr,&addrlen,NULL,NULL); memcpy(&sain,&ClientAddr,addrlen); sprintf(cAddr,"%d.%d.%d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论