计算机网络课程设计报告姓名:徐新凯学号:1305010216班级:计算机科学与技术2班指导老师:姜磊湖南科技大学计算机科学与工程学院2015年12月11、网络聊天程序设计与实现.........................22、Ping程序设计...................................83、基于IP多播的网络会议程序........................164、简单WebServer程序的设计与实现.................225、心得体会.......................................292一、课程设计题目《网络聊天程序的设计与实现》二、课程设计内容了解socket通信的原理,在此基础上编写一个聊天程序。三、课程设计步骤1、服务器端编程的步骤:1.1、加载套接字库,创建套接字(WSAStartup()/socket());1.2、绑定套接字到一个IP地址和一个端口上;1.3、将套接字设定为监听模式等待连接请求(listen());1.4、请求到来后,接受链接请求,返回一个新的应对于此次链接的套接字(accept());1.5、返回套接字和客户端进行通信(send()/recv());1.6、返回,等待另一个连接请求;1.7、关闭套接字,关闭套接字库(closesocket()WSACleanup())。2、客户端编程步骤:2.1、加载套接字库,创建套接字(WSAStartup()/socket());2.2、向服务端发出链接请求(connect());2.3、和服务端进行通信(send()/recv());2.4、关闭套接字,关闭套接字库(closesocket()/WSACleanup())四、调试过程该程序是用c编写的,首先,我先用c编写一个客户端和一个服务器端,代码主要是参照了实验说明书上的,在此基础上稍做了些修3改,实现一个简单客户端与服务端通信。在实现过程中出现了问题,后来通过网上查资料和请教别人解决了。例如:与没有链接ws2_32.lib的库文件,是程序编译时出现错误;还有由于我用的是TCP协议通讯,它一次只接收一个数据包,这样就只能实现点对点通信,而不能异步通信,后来,我通过一个简单的线程解决了该问题;最后,我专门写出了一个服务器转发客户端发过来的信息到其他的客户端,这样服务器只是作为服务器,客户端连接服务器后可以进行客户端与客户端的聊天五、课程设计结果及结果分析该程序的最终结果是一个可以在局域网内进行简单异步通信的程序,如下图所示:服务器主要的程序源代码:voidCreateTranServer(){SOCKETm_SockServer;//开始监听的SOCKET句柄structsockaddr_inserveraddr;//用于绑定的地址信息//structsockaddr_in中的in标识Internet,就是网络地址,属于AF_INET地址族structsockaddr_inserveraddrfrom;//接收到的连接的地址信息intiRes;//获取绑定的结果SOCKETm_Server;//已建立连接的SOCKET句柄structhostent*localHost;//主机环境指针char*localIP;//本地IP地址4structCSendPackagesp;//发送包intiMaxConnect=20;//允许的最大连接个数20个intiConnect=0;//建立连接的个数DWORDnThreadId=0;//获取线程的ID值charcWarnBuffer[]=ItisoverMaxconnect\0;//警告字符串intlen=sizeof(structsockaddr);//IP地址长度structsockaddr是一个通用地址结构,可以被bind()与connect()等函数调用intid;//新分配的客户IDlocalHost=gethostbyname();localIP=inet_ntoa(*(structin_addr*)*localHost-h_addr_list);//获取本地IPserveraddr.sin_family=AF_INET;serveraddr.sin_port=htons(4600);//设置绑定的端口号serveraddr.sin_addr.S_un.S_addr=inet_addr(localIP);//设置本地IP//创建套接字m_SockServer=socket(AF_INET,SOCK_STREAM,0);if(m_SockServer==INVALID_SOCKET){printf(建立套接字失败\n);exit(0);}//绑定本地IP地址iRes=bind(m_SockServer,(structsockaddr*)&serveraddr,sizeof(structsockaddr));if(iRes0){printf(建立套接字失败\n);exit(0);}charip[20]={0};findIP(ip,sizeof(ip));printf(服务器创建成功,IP为本机IP:%s\n,ip);//程序主循环while(1){listen(m_SockServer,0);//开始监听m_Server=accept(m_SockServer,(structsockaddr*)&serveraddrfrom,&len);//接收连接if(m_Server!=INVALID_SOCKET){printf(有新用户登陆);//对方已登陆if(iConnectiMaxConnect){//启动接收消息线程5CreateThread(NULL,0,threadTranServer,(LPVOID)m_Server,0,&nThreadId);//构建连接用户的信息usrinfo[iConnect].ID=iConnect+1;//存放用户IDusrinfo[iConnect].sUserSocket=m_Server;usrinfo[iConnect].iPort=0;//存放端口,扩展用//构建发包信息sp.iType=SERVERSEND_SELFID;//获取的ID值,返回信息sp.iCurConn=iConnect;//在线个数id=iConnect+1;sprintf(sp.cBuffer,%d\0,id);send(m_Server,(char*)&sp,sizeof(sp),0);/发送客户端的ID值//通知各个客户端if(iConnect0)CreateThread(NULL,0,NotyifyProc,(LPVOID)&id,0,&nThreadId);iConnect++;}elsesend(m_Server,cWarnBuffer,sizeof(cWarnBuffer),0);//已超出最大连接数}}WSACleanup();}客户端主要源程序:6voidCreateTranClient(){SOCKETm_SockClient;//建立连接的socketstructsockaddr_inclientaddr;//目标的地址信息intiRes;//函数执行情况charcSendBuffer[1024];//发送消息的缓存DWORDnThreadId=0;//保存线程的ID值structCReceivePackagesp;//发包结构charIPBuffer[128];printf(输入服务器IP地址\n);scanf(%s,IPBuffer);clientaddr.sin_family=AF_INET;clientaddr.sin_port=htons(4600);//连接的端口号clientaddr.sin_addr.S_un.S_addr=inet_addr(IPBuffer);m_SockClient=socket(AF_INET,SOCK_STREAM,0);/创建socket//建立与服务端的连接iRes=connect(m_SockClient,(structsockaddr*)&clientaddr,sizeof(structsockaddr));if(iRes0){printf(连接错误\n);exit(0);}//启动接收消息的线程CreateThread(NULL,0,threadTranClient,(LPVOID)m_SockClient,0,&nThreadId);while(1)//接收到自己ID{memset(cSendBuffer,0,1024);scanf(%s,cSendBuffer);//输入发送内容if(bSend){if(sizeof(cSendBuffer)0){memset(&sp,0,sizeof(sp));strcpy(sp.cBuffer,cSendBuffer);sp.iToID=usr[0].ID;//聊天对象是固定的sp.iFromID=iMyself;//自己sp.iType=CLIENTSEND_TRAN;send(m_SockClient,(char*)&sp,sizeof(sp),0);//发送消息}if(strcmp(exit,cSendBuffer)==0)7{memset(&sp,0,sizeof(sp));strcpy(sp.cBuffer,退出);//设置发送消息的文本内容sp.iFromID=iMyself;sp.iType=CLIENTSEND_EXIT;//退出send(m_SockClient,(char*)&sp,sizeof(sp),0);//发送消息ExitTranSystem();}}elseprintf(没有接收对象,发送失败\n);Sleep(10);}}分析:该聊天程序的最终结果如上图所示,一个端口作为服务端,两个客户端连接服务器,连接成功后,就可以在输入框里进行聊天,然后显示出来。主要的缺点是,只能实现一对一的聊天,不能够实现一对多的。8一、课程设计题目Tracert与Ping程序设计与实现二、课程设计内容了解Tracert程序的实现原理,并调试通过。然后参考Tracert程序和教材4.4.2节,编写一个Ping程序,并能测试本局域网的所有机器是否在线。三、课程设计步骤1.熟悉IP及ICMP协议的工作机制。2.熟悉RAW模式的SOCKET编程。3.编写Ping的实现程序。4.编译环境中需要包括的SOCKET库win2_32.lib。5.调试并运行自己编写的Ping程序。四、调试过程该程序是用c++在VC6.0下实现的,在编写过程中,出现了各种问题,因为该程序相对来说比较复杂,要实现查询指定IP的是否在线、还有它的路由号和传送的数据大小。由于对IP和ICMP协议的使用还不是很熟练,在实现过程中,虽然了解其主要的原理,但是总会出现一些细节方面的错误,使程序无法编译通过,再经过仔细检查之,终于成功实现了。五、课程设计结果及结果分析在编译通过后,就可以调用该程序保存目录下的可执行文件了,通过命令提示符来操作,具体结果如下图所示:91、这个是一个简单的Ping程序,检测机房内ip从100到150。主要源程序://PING功能实现voidPing(char*pstrHost,boollogic){charc;SOCKETrawSocket;LPHOSTENTlpHost;structsockaddr_indestIP;structsockaddr_insrcIP;DWORDdwTimeSent;DWORDdwElapsed;u_charcTTL;intnLoop,k=4;intnRet,minimum=100000,maximum=0,average=0;intsent=4,reveived=0,lost=0;//创建原始套接字,ICMP类型rawSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICM