計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告姓名:學(xué)號(hào):班級(jí):指導(dǎo)老師:湖南科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院2021年6月目錄課程設(shè)計(jì)目的1課程設(shè)計(jì)內(nèi)容1課程設(shè)計(jì)題目2網(wǎng)絡(luò)聊天程序設(shè)計(jì)2Ping程序設(shè)計(jì)5基于IP多播的網(wǎng)絡(luò)會(huì)議程序6心得體會(huì)8參考文獻(xiàn)8附錄(源代碼)8一、課程設(shè)計(jì)目的加深對(duì)計(jì)算機(jī)網(wǎng)絡(luò)通信的工作原理的理解。通過(guò)編寫(xiě)計(jì)算機(jī)程序?qū)崿F(xiàn)、模擬網(wǎng)絡(luò)的某些功能,使學(xué)生理解并掌握計(jì)算機(jī)網(wǎng)絡(luò)的基本原理及工作過(guò)程。實(shí)現(xiàn)應(yīng)用程序進(jìn)程跨網(wǎng)絡(luò)的通信了解系統(tǒng)調(diào)用和應(yīng)用編程接口基本知識(shí),理解應(yīng)用程序和操作系統(tǒng)之間傳遞控制權(quán)的機(jī)制,掌握套接字的創(chuàng)建和運(yùn)用,通過(guò)socket系統(tǒng)調(diào)用實(shí)現(xiàn)跨網(wǎng)絡(luò)通信。提高網(wǎng)絡(luò)編程和應(yīng)用能力提高實(shí)際編程能力和靈活運(yùn)用所學(xué)知識(shí)解決的能力。培養(yǎng)調(diào)查研究、查閱技術(shù)文獻(xiàn)、資料、手冊(cè)以及編寫(xiě)技術(shù)文檔的能力,理論應(yīng)用于實(shí)踐的能力。課程設(shè)計(jì)內(nèi)容網(wǎng)絡(luò)聊天程序的設(shè)計(jì)與實(shí)現(xiàn)了解socket通信的原理,在此基礎(chǔ)上編寫(xiě)一個(gè)一個(gè)聊天程序。Ping程序設(shè)計(jì)與實(shí)現(xiàn)了解ping程序的實(shí)現(xiàn)原理,并調(diào)試通過(guò)?;贗P多播的網(wǎng)絡(luò)會(huì)議程序由sender和receiver兩個(gè)程序組成,sender用戶從控制臺(tái)輸入多播發(fā)送數(shù)據(jù),receiver端都要求加入同一個(gè)多播組,完成sender發(fā)送的多播數(shù)據(jù)。課程設(shè)計(jì)題目1.聊天程序設(shè)計(jì)與實(shí)現(xiàn)2.Ping程序設(shè)計(jì)與實(shí)現(xiàn)3.基于IP多播的網(wǎng)絡(luò)會(huì)議程序設(shè)計(jì)四、網(wǎng)絡(luò)聊天程序設(shè)計(jì)4.1設(shè)計(jì)步驟服務(wù)器端編程的步驟:加載套接字庫(kù),創(chuàng)建套接字(WSAStartup()/socket());綁定套接字到一個(gè)IP地址和一個(gè)端口上;將套接字設(shè)定為監(jiān)聽(tīng)模式等待連接請(qǐng)求(listen());請(qǐng)求到來(lái)后,接受鏈接請(qǐng)求,返回一個(gè)新的應(yīng)對(duì)于此次鏈接 的套接字(accept());返回套接字和客戶端進(jìn)行通信(send()/recv());返回,等待另一個(gè)連接請(qǐng)求;關(guān)閉套接字,關(guān)閉套接字庫(kù)(closesocket()WSACleanup())。客戶端編程步驟:加載套接字庫(kù),創(chuàng)建套接字(WSAStartup()/socket());向服務(wù)端發(fā)出鏈接請(qǐng)求(connect());和服務(wù)端進(jìn)行通信(send()/recv());關(guān)閉套接字,關(guān)閉套接字庫(kù)(closesocket()/WSACleanup())4.2調(diào)試過(guò)程該程序是用c++編寫(xiě)的,用MFC做的界面,首先,我先用c++編寫(xiě)一個(gè)客戶端和一個(gè)服務(wù)器端,代碼主要是參照了實(shí)驗(yàn)說(shuō)明書(shū)上的,在此基礎(chǔ)上稍做了些修改,實(shí)現(xiàn)一個(gè)簡(jiǎn)單客戶端與服務(wù)端通信。在實(shí)現(xiàn)過(guò)程中出現(xiàn)了問(wèn)題,后來(lái)通過(guò)網(wǎng)上查資料和請(qǐng)教別人解決了。例如:與沒(méi)有鏈接ws2_32.lib的庫(kù)文件,是程序編譯時(shí)出現(xiàn)錯(cuò)誤;還有由于我用的是TCP協(xié)議通訊,它一次只接收一個(gè)數(shù)據(jù)包,這樣就只能實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信,而不能異步通信,后來(lái),我通過(guò)一個(gè)簡(jiǎn)單的線程解決了該問(wèn)題;另外,在使用MFC封裝的時(shí)候,由于服務(wù)端要使用監(jiān)聽(tīng)模式,當(dāng)沒(méi)有收到連接請(qǐng)求時(shí),會(huì)出現(xiàn)阻塞現(xiàn)象,也是用進(jìn)程解決的。4.3設(shè)計(jì)結(jié)果和結(jié)果分析該程序的最終結(jié)果是一個(gè)可以在局域網(wǎng)內(nèi)進(jìn)行簡(jiǎn)單異步通信的程序,如下圖所示:分析:該聊天程序的最終結(jié)果如上圖所示,由一個(gè)界面構(gòu)成,一個(gè)端口作為客戶端,一個(gè)端口作為服務(wù)端,連接成功后,就可以在輸入框里進(jìn)行聊天,然后顯示在一個(gè)顯示框里。主要的缺點(diǎn)是,只能實(shí)現(xiàn)一對(duì)一的聊天,不能夠?qū)崿F(xiàn)一對(duì)多的。另附源代碼于附錄一Ping程序設(shè)計(jì)與實(shí)現(xiàn)5.1設(shè)計(jì)步驟熟悉IP及ICMP協(xié)議的工作機(jī)制。熟悉RAW模式的SOCKET編程。編寫(xiě)Ping的實(shí)現(xiàn)程序。編譯環(huán)境中需要包括的SOCKET庫(kù)win2_32.lib。調(diào)試并運(yùn)行自己編寫(xiě)的Ping程序。5.2調(diào)試過(guò)程該程序是用c++在VC6.0下實(shí)現(xiàn)的,在編寫(xiě)過(guò)程中,出現(xiàn)了各種問(wèn)題,因?yàn)樵摮绦蛳鄬?duì)來(lái)說(shuō)比較復(fù)雜,要實(shí)現(xiàn)查詢指定IP的是否在線、還有它的路由號(hào)和傳送的數(shù)據(jù)大小。由于對(duì)IP和ICMP協(xié)議的使用還不是很熟練,在實(shí)現(xiàn)過(guò)程中,雖然了解其主要的原理,但是總會(huì)出現(xiàn)一些細(xì)節(jié)方面的錯(cuò)誤,使程序無(wú)法編譯通過(guò),再經(jīng)過(guò)仔細(xì)檢查之,終于成功實(shí)現(xiàn)了。5.3設(shè)計(jì)結(jié)果及結(jié)果分析在編譯通過(guò)后,就可以調(diào)用該程序保存目錄下的可執(zhí)行文件了,通過(guò)命令提示符來(lái)操作,具體結(jié)果如下圖所示:分析:如上圖所示,該程序是我自己編寫(xiě)的一個(gè)實(shí)現(xiàn)Ping的功能的程序,它的功能主要有三個(gè),通過(guò)令:ping39可以查詢?cè)揑P是否在線,還有-r,-d兩個(gè)命令是查找目的地址的如有何發(fā)送數(shù)據(jù)報(bào)的大小的。源代碼另附于附錄二基于IP多播的網(wǎng)絡(luò)會(huì)議程序6.1設(shè)計(jì)步驟啟動(dòng)Visualc++6.0,創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目工程,在此工程下添加Sender和Receiver兩個(gè)項(xiàng)目。Receiver項(xiàng)目實(shí)現(xiàn)步驟:、創(chuàng)建一個(gè)SOCK_DGRAM類型的Socket。、將此socket綁定到本地的一個(gè)端口上,為了實(shí)現(xiàn)接 收服務(wù)器端發(fā)送的多播數(shù)據(jù)。加入多播組。接受多播數(shù)據(jù)。Sender實(shí)現(xiàn)步驟:、創(chuàng)建一個(gè)SOCK_DGRAM類型的Socket。、加入多播組。、發(fā)送多播數(shù)據(jù)。然后運(yùn)行各自的程序,進(jìn)行調(diào)試。6.2調(diào)試過(guò)程該程序至少需要在兩臺(tái)機(jī)器上進(jìn)行測(cè)試,因?yàn)橐幸粋€(gè)發(fā)送方和一個(gè)接收方,發(fā)送方執(zhí)行Sender項(xiàng)目,接受方執(zhí)行Reciever項(xiàng)目,然后看是否能正常發(fā)送和接受。6.3調(diào)試結(jié)果及結(jié)果分析。該程序的最終目的是實(shí)現(xiàn)多播,就是能同時(shí)給多帶計(jì)算機(jī)發(fā)送消息,運(yùn)行結(jié)果如下圖所示:以上兩個(gè)圖就是該程序運(yùn)行時(shí)的結(jié)果,一方法送,另一方接收, 并顯示其IP地址,但還有一些不足只處,沒(méi)能將它整合成一個(gè)即 能接收又能發(fā)送消息的,并有界面的設(shè)計(jì)。源代碼另附于附錄三。心得體會(huì)通過(guò)本次課程設(shè)計(jì),我收獲了不少東西,通過(guò)編寫(xiě)計(jì)算機(jī)程序?qū)崿F(xiàn)、模擬網(wǎng)絡(luò)的一些功能,使我理解并掌握計(jì)算機(jī)網(wǎng)絡(luò)的基本原理及工作過(guò)程。對(duì)系統(tǒng)調(diào)用和應(yīng)用編程接口基本知識(shí)更加熟悉,了解了應(yīng)用程序和操作系統(tǒng)之間傳遞控制權(quán)的機(jī)制,并掌握了套接字的創(chuàng)建和運(yùn)用,通過(guò)socket系統(tǒng)調(diào)用實(shí)現(xiàn)跨網(wǎng)絡(luò)通信。同時(shí)提高了我實(shí)際編程能力和靈活運(yùn)用所學(xué)知識(shí)解決的能力。 讓我提高了自己調(diào)查研究、查閱技術(shù)文獻(xiàn)、資料、手冊(cè)以及編寫(xiě) 技術(shù)文檔的能力,理論應(yīng)用于實(shí)踐的能力。八、參考文獻(xiàn)[1].謝希仁,計(jì)算機(jī)網(wǎng)絡(luò)(第五版),電子工業(yè)出版社,2021。[2].百度[3]計(jì)算網(wǎng)絡(luò)課程設(shè)計(jì)指導(dǎo)書(shū)。附錄附錄一:聊天程序源代碼附錄二:Ping程序源代碼附錄三:IP多播的網(wǎng)絡(luò)會(huì)議程序源代碼附錄一:創(chuàng)建服務(wù)器函數(shù):voidCChatDlg::OnCreateServer(){ //TODO:Addyourcontrolnotificationhandlercodehere CWnd*subWnd; CStringport; subWnd=GetDlgItem(IDC_EDIT5); subWnd->GetWindowText(port); UINTintport=UINT(atoi(LPCSTR(port))); WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { return; } if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return; } SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0); addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(intport); intret=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); listen(sockSrv,5); intlen=sizeof(SOCKADDR); sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); charsendBuf[50]; sprintf(sendBuf,"Welcome%stohere!",inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0);hThread=CreateThread(NULL,0,RecvProc1,NULL,0,NULL);}DWORDWINAPIRecvProc1(LPVOIDlpParameter){ charb[50]="QUIT"; while(1) { charrecvBuf[50]; recv(sockConn,recvBuf,50,0); if(strlen(recvBuf)==4&&recvBuf[0]==b[0]&&recvBuf[1]==b[1]&&recvBuf[2]==b[2]&&recvBuf[3]==b[3]) { HWNDhWnd=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT1); sbuf+="對(duì)方已經(jīng)斷開(kāi)連接!\r\n"; CWnd*pWnd=CWnd::FromHandle(hWnd); pWnd->SetWindowText(sbuf); return0; } sbuf+="friend:\r\n"; sbuf+=recvBuf; sbuf+="\r\n"; HWNDhWnd=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT1); CWnd*pWnd=CWnd::FromHandle(hWnd); pWnd->SetWindowText(sbuf); } return0;}鏈接服務(wù)器函數(shù):voidCChatDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere CWnd*subWnd; WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { return; } if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return; }sockConn=socket(AF_INET,SOCK_STREAM,0); CStringport; subWnd=GetDlgItem(IDC_EDIT3); subWnd->GetWindowText(port); UINTintport=UINT(atoi(LPCSTR(port))); CStringip; subWnd=GetDlgItem(IDC_EDIT2); subWnd->GetWindowText(ip); charsIp[16];strncpy(sIp,LPCSTR(ip),16); addrSrv.sin_addr.S_un.S_addr=inet_addr(sIp); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(intport); if(connect(sockConn,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==SOCKET_ERROR) MessageBox("連接失敗"); else{ MessageBox("連接成功"); charrecvBuf[50]; recv(sockConn,recvBuf,50,0); sbuf+="server:\r\n"; sbuf+=recvBuf; sbuf+="\r\n"; subWnd=GetDlgItem(IDC_EDIT1); subWnd->SetWindowText(sbuf); send(sockConn,"客戶端鏈接成功!",strlen("客戶端鏈接成功!")+1,0); HANDLEhThread=CreateThread(NULL,0,RecvProc1,NULL,0,NULL); }}發(fā)送消息函數(shù):voidCChatDlg::OnButton3(){ CWnd*subWnd; CStringsendBuf1; subWnd=GetDlgItem(IDC_EDIT4); subWnd->GetWindowText(sendBuf1); subWnd->SetWindowText(NULL); sbuf+="I:\r\n"; sbuf+=sendBuf1; sbuf+="\r\n"; send(sockConn,sendBuf1,strlen(sendBuf1)+1,0); subWnd=GetDlgItem(IDC_EDIT1); subWnd->SetWindowText(sbuf); }退出函數(shù):voidCChatDlg::OnButton5(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringsendBuf; sendBuf="QUIT"; send(sockConn,sendBuf,strlen(sendBuf)+1,0); closesocket(sockConn); WSACleanup(); AfxGetMainWnd()->SendMessage(WM_CLOSE);}附錄二:#include"Ping.h"intmain(intargc,char*argv[]){ if(argc==1) { usageinfo(argv[0]); return-1; } BOOLbRecordRout=FALSE; SOCKEThSocket=INVALID_SOCKET; SOCKADDR_INdstSin; SOCKADDR_INfromSin; IP_OPT_HEADERipOptHeader; char*pIcmpData=NULL; char*pRecvData=NULL; char*lpDstIp=NULL; intdatasize=DEF_PACKET_SIZE; intret; intrcvNum; for(inti=1;i<argc;i++) { if(strchr(argv[i],'-')) { switch(tolower(argv[i][1])) { case'r': bRecordRout=TRUE; break; case'd': datasize=atoi(argv[i+1]); i=argc+1; break; } } elseif(strchr(argv[i],'.')) { intl=strlen(argv[i]); if(l<7||l>15) { usageinfo(argv[0]); } else {lpDstIp=argv[i]; } } } WSADATAwsaData; WORDwVer=MAKEWORD(2,2); if(WSAStartup(wVer,&wsaData)!=0) { printf("WSAStartupError!\n"); return-1; } hSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); if(hSocket==INVALID_SOCKET) { printf("WSASocketError,Code:%d",WSAGetLastError()); WSACleanup(); return-1; } if(bRecordRout) { ZeroMemory(&ipOptHeader,sizeof(ipOptHeader)); ipOptHeader.code=IP_RECORD_ROUTER; ipOptHeader.len=39; ipOptHeader.ptr=4; if((ret=setsockopt(hSocket,IPPROTO_IP,IP_OPTIONS,(char*)&ipOptHeader,sizeof(ipOptHeader)))==SOCKET_ERROR) { printf("setsockopt(IP_OPTIONS)error,code:%d",WSAGetLastError()); WSACleanup(); closesocket(hSocket); return-1; } } inttimeout=1000; if((ret=setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR) { printf("setsockopt(SO_RCVTIMEO)error,code:%d",WSAGetLastError()); WSACleanup(); closesocket(hSocket); return-1; } if((ret=setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR) { printf("setsockopt(SO_SNDTIMEO)error,code:%d",WSAGetLastError()); WSACleanup(); return-1; } pIcmpData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET_SIZE); pRecvData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET_SIZE); if(pIcmpData==NULL||pRecvData==NULL) { printf("HeapAllError\n"); WSACleanup(); return-1; } datasize+=sizeof(ICMP_HEADER); ZeroMemory(&dstSin,sizeof(dstSin)); dstSin.sin_family=AF_INET; dstSin.sin_addr.s_addr=inet_addr(lpDstIp); FillIcmpData(pIcmpData,datasize); printf("Ping%swith%dbytesofdata\n",inet_ntoa(dstSin.sin_addr),datasize); intcount=0; intseq=0; rcvNum=0; while(1) { count++; if(count==5) break; ((PICMP_HEADER)pIcmpData)->checksum=0; ((PICMP_HEADER)pIcmpData)->seq=seq++; ((PICMP_HEADER)pIcmpData)->timestamp=GetTickCount(); ((PICMP_HEADER)pIcmpData)->checksum=CheckSum((USHORT*)pIcmpData,datasize); if((ret=sendto(hSocket,pIcmpData,datasize,0,(LPSOCKADDR)&dstSin,sizeof(dstSin)))==SOCKET_ERROR) { if(WSAGetLastError()==WSAETIMEDOUT) { printf("timeout.\n"); continue; } else { printf("sendtoerror,code:%d",WSAGetLastError()); closesocket(hSocket); WSACleanup(); return-1; } } intfromLen=sizeof(fromSin); if((ret=recvfrom(hSocket,pRecvData,MAX_PACKET_SIZE,0,(sockaddr*)&fromSin,&fromLen))==SOCKET_ERROR) { if(WSAGetLastError()==WSAETIMEDOUT) { printf("timeout.\n"); continue; } printf("recvfromfail!\n"); closesocket(hSocket); WSACleanup(); return-1; } rcvNum++; //printf("%d",rcvNum); DecodeIcmpHeader(pRecvData,ret,&fromSin); } printf("\nPingStatiscsfor:%s\n",lpDstIp); printf("\tSend=%d,Received=%d,Lost=%d(%d%%loss)",4,rcvNum,4-rcvNum,(4-rcvNum)/4*100); if(hSocket!=INVALID_SOCKET) closesocket(hSocket); HeapFree(GetProcessHeap(),0,pIcmpData); HeapFree(GetProcessHeap(),0,pRecvData); WSACleanup(); return0; } voidusageinfo(char*progname) { printf("Pingtool,byblode(blode@\n"); printf("usage:ping[-r]<hostip>[-d][datasize]\n"); printf("\t-r:\trecordrouter\n"); printf("\thostip:\thostiptoping\n"); printf("\t-d:\tusedatasizeoption\n"); printf("\tdatasize:\tdatasizetoping(<=1024)\n"); } voidFillIcmpData(char*icmp_data,intsize) { ICMP_HEADER*icmpHdr; icmpHdr=(PICMP_HEADER)icmp_data; icmpHdr->checksum=0; icmpHdr->code=0; icmpHdr->id=(unsignedshort)GetCurrentProcessId(); icmpHdr->seq=0; icmpHdr->type=ICMP_ECHO; icmpHdr->timestamp=0; } USHORTCheckSum(USHORT*buf,intsize) { USHORTcksum=0; while(size>1) { cksum+=*buf++; size-=sizeof(USHORT); } if(size) cksum+=*buf++; cksum=(cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return(USHORT)(~cksum); } voidDecodeIcmpHeader(char*buf,intret,LPSOCKADDR_INlpSin) { ICMP_HEADER*icmpHdr; IP_HEADER*ipHdr; intipHdrLen; staticintfirst=0; DWORDtick=GetTickCount(); ipHdr=(IP_HEADER*)buf; ipHdrLen=ipHdr->h_len*4; if(ipHdrLen==60&&!first) DecodeIpHeader(buf,ret); icmpHdr=(ICMP_HEADER*)(buf+ipHdrLen); if(icmpHdr->type!=ICMP_ECHOREPLY) { printf("noechoreply%drecved\n"); return; } if(icmpHdr->id!=(USHORT)GetCurrentProcessId()) { printf("someoneelse'spacket!\n"); return; } printf("Replyfrom:%s",inet_ntoa(lpSin->sin_addr)); printf("\tbytes:%dicmpseq:%dTTL=128",ret,icmpHdr->seq); printf("time:%dms\n",tick-icmpHdr->timestamp); first++; return; } voidDecodeIpHeader(char*buf,intbytes) { IP_OPT_HEADER*ipOptHdr; IN_ADDRin; ipOptHdr=(IP_OPT_HEADER*)(buf+20); printf("RecordReouter:"); for(inti=0;i<(ipOptHdr->ptr/4)-1;i++) { in.S_un.S_addr=ipOptHdr->addr[i]; printf("\t%-15s\n",inet_ntoa(in)); } }Ping.h文件:#defineWIN32_LEAN_AND_MEAN#include<windows.h>//windows下socket通信所必須的函數(shù)庫(kù)#include<winsock2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructtagIP_HEADER{ unsignedinth_len:4; unsignedintver:4; unsignedchartos; unsignedshorttotal_len; unsignedshortident; unsignedshortfrag_flags; unsignedcharttl; unsignedcharprotocol; unsignedshortchecksum; unsignedintsourceip; unsignedintdestip;}IP_HEADER,*PIP_HEADER;typedefstructtagIP_OPT_HEADER{ unsignedcharcode; unsignedcharlen; unsignedcharptr; unsignedlongaddr[9];}IP_OPT_HEADER,*PIP_OPT_HEADER;typedefstructtagICMP_HEADER{ unsignedchartype; unsignedcharcode; unsignedshortchecksum; unsignedshortid; unsignedshortseq; unsignedlongtimestamp;}ICMP_HEADER,*PICMP_HEADER;#defineDEF_PACKET_SIZE32#defineMAX_PACKET_SIZE1024#defineICMP_ECHO8#defineICMP_ECHOREPLY0#defineIP_RECORD_ROUTER7voidusageinfo(char*progname);voidFillIcmpData(char*icmp_data,intsize);USHORTCheckSum(USHORT*buf,intsize);voidDecodeIcmpHeader(char*buf,intret,LPSOCKADDR_INlpSin);voidDecodeIpHeader(char*buf,intbytes);附錄三:#include<winsock2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#defineMCASTADDR""#defineMCASTPORT5150#defineBUFSIZE1024intmain(intargc,char**argv){ WSADATAwsd; structsockaddr_inlocal,remote,from; SOCKETsock,sockM; TCHARrecvbuf[BUFSIZE]; intlen=sizeof(structsockaddr_in); intret; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { printf("WSAStartup()failed\n"); return-1; } if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED))== INVALID_SOCKET) { printf("socketfailedwith:%d\n",WSAGetLastError()); WSACleanup(); return-1; } local.sin_family=AF_INET; local.sin_port=htons(MCASTPORT); local.sin_addr.s_addr=INADDR_ANY; if(bind(sock,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR) { printf("bindfailedwith:%d",WSAGetLastError()); closesocket(sock); WSACleanup(); return-1; } remote.sin_family=AF_INET; remote.sin_port=htons(MCASTPORT); remote.sin_addr.s_addr=inet_addr(MCASTADDR); if((sockM=WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論