版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 計算機網絡</b></p><p><b> 課程設計報告</b></p><p><b> 姓 名: </b></p><p><b> 學 號:</b></p><p><b> 班 級:&l
2、t;/b></p><p><b> 指導老師:</b></p><p><b> 2013年6月</b></p><p><b> 目錄</b></p><p> 課程設計目的...................................1</p&
3、gt;<p> 課程設計內容...................................1</p><p> 課程設計題目...................................2</p><p> 網絡聊天程序設計...............................2</p><p> Ping程序設計...
4、...............................5</p><p> 基于IP多播的網絡會議程序........................6</p><p> 心得體會.......................................8</p><p> 參考文獻.................................
5、......8</p><p> 附錄(源代碼)...................................8</p><p><b> 一、課程設計目的</b></p><p> 加深對計算機網絡通信的工作原理的理解。</p><p> 通過編寫計算機程序實現(xiàn)、模擬網絡的某些功能,使學生理解并掌握計算
6、機網絡的基本原理及工作過程。</p><p> 實現(xiàn)應用程序進程跨網絡的通信</p><p> 了解系統(tǒng)調用和應用編程接口基本知識,理解應用程序和操作系統(tǒng)之間傳遞控制權的機制,掌握套接字的創(chuàng)建和運用,通過socket系統(tǒng)調用實現(xiàn)跨網絡通信。</p><p> 提高網絡編程和應用能力</p><p> 提高實際編程能力和靈活運用所學知識
7、解決的能力。培養(yǎng)調查研究、查閱技術文獻、資料、手冊以及編寫技術文檔的能力,理論應用于實踐的能力。</p><p><b> 課程設計內容</b></p><p> 網絡聊天程序的設計與實現(xiàn)</p><p> 了解socket通信的原理,在此基礎上編寫一個一個聊天程序。</p><p> Ping程序設計與實現(xiàn)&l
8、t;/p><p> 了解ping程序的實現(xiàn)原理,并調試通過。</p><p> 基于IP多播的網絡會議程序</p><p> 由sender和receiver兩個程序組成,sender用戶從控制臺輸入多播發(fā)送數(shù)據(jù),receiver端都要求加入同一個多播組,完成sender發(fā)送的多播數(shù)據(jù)。</p><p><b> 課程設計題目&
9、lt;/b></p><p> 1.聊天程序設計與實現(xiàn)</p><p> 2.Ping程序設計與實現(xiàn)</p><p> 3.基于IP多播的網絡會議程序設計</p><p> 四、網絡聊天程序設計</p><p><b> 4.1 設計步驟</b></p><p&
10、gt; 服務器端編程的步驟:</p><p> 加載套接字庫,創(chuàng)建套接字(WSAStartup()/socket());</p><p> 綁定套接字到一個IP地址和一個端口上;</p><p> 將套接字設定為監(jiān)聽模式等待連接請求(listen());</p><p> 請求到來后,接受鏈接請求,返回一個新的應對于此次鏈接的套接
11、字(accept());</p><p> 返回套接字和客戶端進行通信(send()/recv());</p><p> 返回,等待另一個連接請求;</p><p> 關閉套接字,關閉套接字庫(closesocket()WSACleanup())。</p><p><b> 客戶端編程步驟:</b></p&
12、gt;<p> 加載套接字庫,創(chuàng)建套接字(WSAStartup()/socket());</p><p> 向服務端發(fā)出鏈接請求(connect());</p><p> 和服務端進行通信(send()/recv());</p><p> 關閉套接字,關閉套接字庫(closesocket()/WSACleanup())</p>&
13、lt;p><b> 4.2調試過程</b></p><p> 該程序是用c++編寫的,用MFC做的界面,首先,我先用c++編寫一個客戶端和一個服務器端,代碼主要是參照了實驗說明書上的,在此基礎上稍做了些修改,實現(xiàn)一個簡單客戶端與服務端通信。在實現(xiàn)過程中出現(xiàn)了問題,后來通過網上查資料和請教別人解決了。例如:與沒有鏈接ws2_32.lib的庫文件,是程序編譯時出現(xiàn)錯誤;還有由于我用的是
14、TCP協(xié)議通訊,它一次只接收一個數(shù)據(jù)包,這樣就只能實現(xiàn)點對點通信,而不能異步通信,后來,我通過一個簡單的線程解決了該問題;另外,在使用MFC封裝的時候,由于服務端要使用監(jiān)聽模式,當沒有收到連接請求時,會出現(xiàn)阻塞現(xiàn)象,也是用進程解決的。</p><p> 4.3 設計結果和結果分析</p><p> 該程序的最終結果是一個可以在局域網內進行簡單異步通信</p><p&
15、gt; 的程序,如下圖所示:</p><p> 分析:該聊天程序的最終結果如上圖所示,由一個界面構成,一個端口作為客戶端,一個端口作為服務端,連接成功后,就可以在輸入框里進行聊天,然后顯示在一個顯示框里。主要的缺點是,只能實現(xiàn)一對一的聊天,不能夠實現(xiàn)一對多的。</p><p><b> 另附源代碼于附錄一</b></p><p> Pi
16、ng程序設計與實現(xiàn)</p><p><b> 5.1設計步驟</b></p><p> 熟悉IP及ICMP協(xié)議的工作機制。</p><p> 熟悉RAW模式的SOCKET編程。</p><p> 編寫Ping的實現(xiàn)程序。</p><p> 編譯環(huán)境中需要包括的SOCKET庫win2_32
17、.lib。</p><p> 調試并運行自己編寫的Ping程序。</p><p><b> 5.2調試過程</b></p><p> 該程序是用c++在VC 6.0下實現(xiàn)的,在編寫過程中,出現(xiàn)了各種問題,因為該程序相對來說比較復雜,要實現(xiàn)查詢指定IP的是否在線、還有它的路由號和傳送的數(shù)據(jù)大小。由于對IP和ICMP協(xié)議的使用還不是很熟練,在
18、實現(xiàn)過程中,雖然了解其主要的原理,但是總會出現(xiàn)一些細節(jié)方面的錯誤,使程序無法編譯通過,再經過仔細檢查之,終于成功實現(xiàn)了。</p><p> 5.3設計結果及結果分析</p><p> 在編譯通過后,就可以調用該程序保存目錄下的可執(zhí)行文件了,通過命令提示符來操作,具體結果如下圖所示:</p><p> 分析:如上圖所示,該程序是我自己編寫的一個實現(xiàn)Ping的功能
19、的程序,它的功能主要有三個,通過令:ping 10.1.13.239可以查詢該IP是否在線,還有-r,-d兩個命令是查找目的地址的如有何發(fā)送數(shù)據(jù)報的大小的。</p><p><b> 源代碼另附于附錄二</b></p><p> 基于IP多播的網絡會議程序</p><p><b> 6.1設計步驟</b></p
20、><p> 啟動Visual c++6.0,創(chuàng)建一個控制臺項目工程,在此工程下添加Sender和Receiver兩個項目。</p><p> Receiver項目實現(xiàn)步驟:</p><p> 、創(chuàng)建一個SOCK_DGRAM類型的Socket。</p><p> 、將此socket綁定到本地的一個端口上,為了實現(xiàn)接收服務器端發(fā)送的多播
21、數(shù)據(jù)。</p><p><b> 加入多播組。</b></p><p><b> 接受多播數(shù)據(jù)。</b></p><p> Sender實現(xiàn)步驟:</p><p> 、創(chuàng)建一個SOCK_DGRAM類型的Socket。</p><p><b> 、加入多播組
22、。</b></p><p><b> 、發(fā)送多播數(shù)據(jù)。</b></p><p> 然后運行各自的程序,進行調試。</p><p><b> 6.2調試過程</b></p><p> 該程序至少需要在兩臺機器上進行測試,因為要有一個發(fā)送方和一個接收方,發(fā)送方執(zhí)行Sender項目,接
23、受方執(zhí)行Reciever項目,然后看是否能正常發(fā)送和接受。</p><p> 6.3調試結果及結果分析。</p><p> 該程序的最終目的是實現(xiàn)多播,就是能同時給多帶計算機發(fā)送消息,運行結果如下圖所示:</p><p> 以上兩個圖就是該程序運行時的結果,一方法送,另一方接收,并顯示其IP地址,但還有一些不足只處,沒能將它整合成一個即能接收又能發(fā)送消息的
24、,并有界面的設計。</p><p> 源代碼另附于附錄三。</p><p><b> 心得體會</b></p><p> 通過本次課程設計,我收獲了不少東西, 通過編寫計算機程序實現(xiàn)、模擬網絡的一些功能,使我理解并掌握計算機網絡的基本原理及工作過程。對系統(tǒng)調用和應用編程接口基本知識更加熟悉,了解了應用程序和操作系統(tǒng)之間傳遞控制權的機制,并
25、掌握了套接字的創(chuàng)建和運用,通過socket系統(tǒng)調用實現(xiàn)跨網絡通信。</p><p> 同時提高了我實際編程能力和靈活運用所學知識解決的能力。讓我提高了自己調查研究、查閱技術文獻、資料、手冊以及編寫技術文檔的能力,理論應用于實踐的能力。</p><p><b> 八、參考文獻</b></p><p> [1].謝希仁,計算機網絡(第五版
26、),電子工業(yè)出版社,2008。</p><p> [2].百度 http://www.baidu.com</p><p> [3]計算網絡課程設計指導書。</p><p><b> 附錄</b></p><p> 附錄一:聊天程序源代碼</p><p> 附錄二:Ping程序源代碼<
27、;/p><p> 附錄三:IP多播的網絡會議程序源代碼</p><p><b> 附錄一:</b></p><p><b> 創(chuàng)建服務器函數(shù):</b></p><p> void CChatDlg::OnCreateServer() </p><p><b>
28、 {</b></p><p> // TODO: Add your control notification handler code here</p><p> CWnd *subWnd;</p><p> CString port;</p><p> subWnd=GetDlgItem(IDC_EDIT5);</
29、p><p> subWnd->GetWindowText(port);</p><p> UINT intport=UINT(atoi(LPCSTR(port)));</p><p> WORD wVersionRequested;</p><p> WSADATA wsaData;</p><p><
30、b> int err;</b></p><p> wVersionRequested=MAKEWORD(1,1);</p><p> err=WSAStartup(wVersionRequested,&wsaData);</p><p> if(err!=0)</p><p><b> {<
31、/b></p><p><b> return;</b></p><p><b> }</b></p><p> if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)</p><p><b> {</b
32、></p><p> WSACleanup();</p><p><b> return;</b></p><p><b> }</b></p><p> SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);</p><p>
33、; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);</p><p> addrSrv.sin_family=AF_INET;</p><p> addrSrv.sin_port=htons(intport);</p><p> int ret=bind(sockSrv,(SOCKADDR*)&addrS
34、rv,sizeof(SOCKADDR));</p><p> listen(sockSrv,5);</p><p> int len=sizeof(SOCKADDR);</p><p> sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);</p><p> cha
35、r sendBuf[50];</p><p> sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));</p><p> send(sockConn,sendBuf,strlen(sendBuf)+1,0);</p><p> hThread=Create
36、Thread(NULL,0,RecvProc1,NULL,0,NULL);</p><p><b> }</b></p><p> DWORD WINAPI RecvProc1(LPVOID lpParameter)</p><p><b> {</b></p><p> char b[50
37、]="QUIT";</p><p><b> while(1)</b></p><p><b> {</b></p><p> char recvBuf[50];</p><p> recv(sockConn,recvBuf,50,0);</p><p
38、> if(strlen(recvBuf)==4&&recvBuf[0]==b[0]&&recvBuf[1]==b[1]&&recvBuf[2]==b[2]&&recvBuf[3]==b[3])</p><p><b> {</b></p><p> HWND hWnd = GetDlgItem
39、(AfxGetMainWnd()->m_hWnd,IDC_EDIT1);</p><p> sbuf+="對方已經斷開連接!\r\n";</p><p> CWnd *pWnd= CWnd::FromHandle(hWnd);</p><p> pWnd->SetWindowText(sbuf);</p><
40、;p><b> return 0;</b></p><p><b> }</b></p><p> sbuf+="friend: \r\n";</p><p> sbuf+=recvBuf;</p><p> sbuf+="\r\n";<
41、/p><p> HWND hWnd = GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT1);</p><p> CWnd *pWnd= CWnd::FromHandle(hWnd);pWnd->SetWindowText(sbuf);</p><p><b> }</b></p>
42、;<p><b> return 0;</b></p><p><b> }</b></p><p><b> 鏈接服務器函數(shù):</b></p><p> void CChatDlg::OnButton1() </p><p><b> {&l
43、t;/b></p><p> // TODO: Add your control notification handler code here</p><p> CWnd *subWnd;</p><p> WORD wVersionRequested;</p><p> WSADATA wsaData;</p>
44、<p><b> int err;</b></p><p> wVersionRequested=MAKEWORD(1,1);</p><p> err=WSAStartup(wVersionRequested,&wsaData);</p><p> if(err!=0)</p><p><
45、;b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p> if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)</p><p><b
46、> {</b></p><p> WSACleanup();</p><p><b> return;</b></p><p><b> }</b></p><p> sockConn=socket(AF_INET,SOCK_STREAM,0);</p>&
47、lt;p> CString port;</p><p> subWnd=GetDlgItem(IDC_EDIT3);</p><p> subWnd->GetWindowText(port);</p><p> UINT intport=UINT(atoi(LPCSTR(port)));</p><p> CString
48、 ip;</p><p> subWnd=GetDlgItem(IDC_EDIT2);</p><p> subWnd->GetWindowText(ip);</p><p> char sIp[16];</p><p> strncpy(sIp,LPCSTR(ip),16);</p><p> add
49、rSrv.sin_addr.S_un.S_addr=inet_addr(sIp);</p><p> addrSrv.sin_family=AF_INET;</p><p> addrSrv.sin_port=htons(intport);</p><p> if(connect(sockConn,(SOCKADDR*)&addrSrv,sizeof(
50、SOCKADDR))==SOCKET_ERROR)</p><p> MessageBox("連接失敗");</p><p><b> else{</b></p><p> MessageBox("連接成功");</p><p> char recvBuf[50];<
51、/p><p> recv(sockConn,recvBuf,50,0);</p><p> sbuf+="server: \r\n";</p><p> sbuf+=recvBuf;</p><p> sbuf+="\r\n";</p><p> subWnd=GetDlg
52、Item(IDC_EDIT1);</p><p> subWnd->SetWindowText(sbuf);</p><p> send(sockConn,"客戶端鏈接成功!",strlen("客戶端鏈接成功!")+1,0);</p><p> HANDLE hThread=CreateThread(NULL,0,
53、RecvProc1,NULL,0,NULL);</p><p><b> }</b></p><p><b> }</b></p><p><b> 發(fā)送消息函數(shù):</b></p><p> void CChatDlg::OnButton3() </p>
54、<p><b> {</b></p><p> CWnd *subWnd;</p><p> CString sendBuf1;</p><p> subWnd=GetDlgItem(IDC_EDIT4);</p><p> subWnd->GetWindowText(sendBuf1);<
55、;/p><p> subWnd->SetWindowText(NULL);</p><p> sbuf+="I : \r\n";</p><p> sbuf+=sendBuf1;</p><p> sbuf+="\r\n";</p><p> send(sockCo
56、nn,sendBuf1,strlen(sendBuf1)+1,0);</p><p> subWnd=GetDlgItem(IDC_EDIT1);</p><p> subWnd->SetWindowText(sbuf);</p><p><b> }</b></p><p><b> 退出函數(shù)
57、:</b></p><p> void CChatDlg::OnButton5() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> CString sendBu
58、f;</p><p> sendBuf="QUIT";</p><p> send(sockConn,sendBuf,strlen(sendBuf)+1,0);</p><p> closesocket(sockConn);</p><p> WSACleanup();</p><p>
59、AfxGetMainWnd()->SendMessage(WM_CLOSE);</p><p><b> }</b></p><p><b> 附錄二:</b></p><p> #include"Ping.h"</p><p> int main(int argc
60、,char *argv[])</p><p><b> {</b></p><p> if(argc==1)</p><p><b> {</b></p><p> usageinfo(argv[0]);</p><p> return -1;</p>
61、<p><b> }</b></p><p> BOOL bRecordRout=FALSE;</p><p> SOCKET hSocket=INVALID_SOCKET;</p><p> SOCKADDR_IN dstSin;</p><p> SOCKADDR_IN fromSin;<
62、/p><p> IP_OPT_HEADER ipOptHeader;</p><p> char *pIcmpData=NULL;</p><p> char *pRecvData=NULL;</p><p> char *lpDstIp=NULL;</p><p> int datasize=DEF_PACKE
63、T_SIZE;</p><p><b> int ret;</b></p><p> int rcvNum;</p><p> for(int i=1;i<argc;i++)</p><p><b> {</b></p><p> if(strchr(argv
64、[i],'-'))</p><p><b> {</b></p><p> switch(tolower(argv[i][1]))</p><p><b> {</b></p><p><b> case 'r':</b></p&g
65、t;<p> bRecordRout=TRUE;</p><p><b> break;</b></p><p><b> case 'd':</b></p><p> datasize=atoi(argv[i+1]);</p><p><b> i
66、=argc+1;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(strchr(argv[i],'.'))</p>
67、;<p><b> {</b></p><p> int l=strlen(argv[i]);</p><p> if(l<7||l>15)</p><p> {usageinfo(argv[0]);</p><p><b> }</b></p>
68、<p><b> else </b></p><p> {lpDstIp=argv[i];</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
69、p> WSADATA wsaData;</p><p> WORD wVer=MAKEWORD(2,2);</p><p> if(WSAStartup(wVer,&wsaData)!=0)</p><p><b> {</b></p><p> printf("WSAStartup E
70、rror!\n");</p><p> return -1;</p><p><b> }</b></p><p> hSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);</p><p> if(hSoc
71、ket==INVALID_SOCKET)</p><p><b> {</b></p><p> printf("WSASocket Error,Code:%d",WSAGetLastError());</p><p> WSACleanup();</p><p> return -1;<
72、;/p><p><b> }</b></p><p> if(bRecordRout)</p><p><b> {</b></p><p> ZeroMemory(&ipOptHeader,sizeof(ipOptHeader));</p><p> ipOp
73、tHeader.code=IP_RECORD_ROUTER;</p><p> ipOptHeader.len=39;</p><p> ipOptHeader.ptr=4;</p><p> if((ret=setsockopt(hSocket,IPPROTO_IP,IP_OPTIONS,(char *)&ipOptHeader,sizeof(ipO
74、ptHeader)))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("setsockopt(IP_OPTIONS) error,code:%d",WSAGetLastError());</p><p> WSACleanup();</p><p
75、> closesocket(hSocket);</p><p> return -1;</p><p><b> }</b></p><p><b> }</b></p><p> int timeout=1000;</p><p> if((ret=set
76、sockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout)))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("setsockopt(SO_RCVTIMEO) error,code:%d",WSAGe
77、tLastError());</p><p> WSACleanup();</p><p> closesocket(hSocket);</p><p> return -1;</p><p><b> }</b></p><p> if((ret=setsockopt(hSocket,
78、SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout)))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("setsockopt(SO_SNDTIMEO) error,code:%d",WSAGetLastError());&l
79、t;/p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b></p><p> pIcmpData=(char *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET_SIZE);</p&g
80、t;<p> pRecvData=(char *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET_SIZE);</p><p> if(pIcmpData==NULL||pRecvData==NULL)</p><p><b> {</b></p><p> p
81、rintf("HeapAll Error\n");</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b></p><p> datasize+=sizeof(ICMP_HEADER);</p><p>
82、; ZeroMemory(&dstSin,sizeof(dstSin));</p><p> dstSin.sin_family=AF_INET;</p><p> dstSin.sin_addr.s_addr=inet_addr(lpDstIp);</p><p> FillIcmpData(pIcmpData,datasize);</p&g
83、t;<p> printf("Ping %s with %d bytes of data\n",inet_ntoa(dstSin.sin_addr),datasize);</p><p> int count=0;</p><p> int seq=0;</p><p><b> rcvNum=0;</b&g
84、t;</p><p><b> while(1)</b></p><p><b> {</b></p><p><b> count++;</b></p><p> if(count==5)</p><p><b> break;&l
85、t;/b></p><p> ((PICMP_HEADER)pIcmpData)->checksum=0;</p><p> ((PICMP_HEADER)pIcmpData)->seq=seq++;</p><p> ((PICMP_HEADER)pIcmpData)->timestamp=GetTickCount();</p&
86、gt;<p> ((PICMP_HEADER)pIcmpData)->checksum=CheckSum((USHORT*)pIcmpData,datasize);</p><p> if((ret=sendto(hSocket,pIcmpData,datasize,0,(LPSOCKADDR)&dstSin,sizeof(dstSin)))==SOCKET_ERROR)</
87、p><p><b> {</b></p><p> if(WSAGetLastError()==WSAETIMEDOUT)</p><p><b> {</b></p><p> printf("time out.\n");</p><p><b
88、> continue;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("sendto error,code:%d",
89、WSAGetLastError());</p><p> closesocket(hSocket);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b></p><p><b> }</b>&l
90、t;/p><p> int fromLen=sizeof(fromSin);</p><p> if((ret=recvfrom(hSocket,pRecvData,MAX_PACKET_SIZE,0,(sockaddr *)&fromSin,&fromLen))==SOCKET_ERROR)</p><p><b> {</b&g
91、t;</p><p> if(WSAGetLastError()==WSAETIMEDOUT)</p><p><b> {</b></p><p> printf("time out.\n");</p><p><b> continue;</b></p>
92、<p><b> }</b></p><p> printf("recvfrom fail!\n");</p><p> closesocket(hSocket);</p><p> WSACleanup();</p><p> return -1;</p><
93、;p><b> }</b></p><p><b> rcvNum++;</b></p><p> //printf("%d",rcvNum);</p><p> DecodeIcmpHeader(pRecvData,ret,&fromSin);</p><p&
94、gt;<b> }</b></p><p> printf("\n Ping Statiscs for:%s\n",lpDstIp);</p><p> printf("\t Send= %d, Received= %d,Lost= %d (%d%%loss)",4,rcvNum,4-rcvNum,(4
95、-rcvNum)/4*100);</p><p> if(hSocket!=INVALID_SOCKET)</p><p> closesocket(hSocket);</p><p> HeapFree(GetProcessHeap(),0,pIcmpData);</p><p> HeapFree(GetProcessHeap()
96、,0,pRecvData);</p><p> WSACleanup();</p><p> return 0;</p><p><b> }</b></p><p> void usageinfo(char *progname)</p><p><b> {</b&g
97、t;</p><p> printf("Ping tool,by blode(blode@peoplemail.com.cn\n");</p><p> printf("usage:ping[-r]<host ip>[-d][data size]\n");</p><p> printf("\t-r
98、:\trecord router\n");</p><p> printf("\thost ip:\thost ip to ping\n");</p><p> printf("\t-d:\tuse data size option\n");</p><p> printf("\tdata size:
99、\tdata size to ping(<=1024)\n");</p><p><b> }</b></p><p> void FillIcmpData(char *icmp_data,int size)</p><p><b> {</b></p><p> ICMP_
100、HEADER *icmpHdr;</p><p> icmpHdr=(PICMP_HEADER)icmp_data;</p><p> icmpHdr->checksum=0;</p><p> icmpHdr->code=0;</p><p> icmpHdr->id=(unsigned short)GetCurr
101、entProcessId();</p><p> icmpHdr->seq=0;</p><p> icmpHdr->type=ICMP_ECHO;</p><p> icmpHdr->timestamp=0;</p><p><b> }</b></p><p> U
102、SHORT CheckSum(USHORT *buf,int size)</p><p><b> {</b></p><p> USHORT cksum=0;</p><p> while(size>1)</p><p><b> {</b></p><p>
103、 cksum+=*buf++;</p><p> size-=sizeof(USHORT);</p><p><b> }</b></p><p><b> if(size)</b></p><p> cksum+=*buf++;</p><p> cksum=(
104、cksum>>16)+(cksum&0xffff);</p><p> cksum+=(cksum>>16);</p><p> return (USHORT)(~cksum);</p><p><b> }</b></p><p> void DecodeIcmpHeader(c
105、har*buf,int ret,LPSOCKADDR_IN lpSin)</p><p><b> {</b></p><p> ICMP_HEADER *icmpHdr;</p><p> IP_HEADER *ipHdr;</p><p> int ipHdrLen;</p><p>
106、 static int first=0;</p><p> DWORD tick=GetTickCount();</p><p> ipHdr=(IP_HEADER*)buf;</p><p> ipHdrLen=ipHdr->h_len*4;</p><p> if(ipHdrLen==60&&!first)
107、</p><p> DecodeIpHeader(buf,ret);</p><p> icmpHdr=(ICMP_HEADER *)(buf+ipHdrLen);</p><p> if(icmpHdr->type!=ICMP_ECHOREPLY)</p><p><b> {</b></p>
108、<p> printf("no echo reply %d recved\n");</p><p><b> return;</b></p><p><b> }</b></p><p> if(icmpHdr->id!=(USHORT)GetCurrentProcessId
109、())</p><p><b> {</b></p><p> printf("someone else's packet!\n");</p><p><b> return;</b></p><p><b> }</b></p>
110、<p> printf("Reply from:%s",inet_ntoa(lpSin->sin_addr));</p><p> printf("\tbytes: %d icmp seq:%d TTL=128",ret,icmpHdr->seq);</p><p> printf("time:%dms\n&
111、quot;,tick-icmpHdr->timestamp);</p><p><b> first++;</b></p><p><b> return;</b></p><p><b> }</b></p><p> void DecodeIpHeader(c
112、har *buf,int bytes)</p><p><b> {</b></p><p> IP_OPT_HEADER *ipOptHdr;</p><p> IN_ADDR in;</p><p> ipOptHdr=(IP_OPT_HEADER*)(buf+20);</p><p>
113、; printf("Record Reouter: ");</p><p> for(int i=0;i<(ipOptHdr->ptr/4)-1;i++)</p><p><b> {</b></p><p> in.S_un.S_addr=ipOptHdr->addr[i];</p>
114、<p> printf("\t%-15s\n",inet_ntoa(in));</p><p><b> }</b></p><p><b> }</b></p><p><b> Ping.h文件:</b></p><p> #def
115、ine WIN32_LEAN_AND_MEAN</p><p> #include<windows.h>//windows下socket通信所必須的函數(shù)庫</p><p> #include<winsock2.h></p><p> #include<ws2tcpip.h></p><p> #in
116、clude<stdio.h></p><p> #include<stdlib.h></p><p> #include<string.h></p><p> typedef struct tagIP_HEADER{</p><p> unsigned int h_len:4;</p>
117、<p> unsigned int ver:4;</p><p> unsigned char tos;</p><p> unsigned short total_len;</p><p> unsigned short ident;</p><p> unsigned short frag_flags;</p&
118、gt;<p> unsigned char ttl;</p><p> unsigned char protocol;</p><p> unsigned short checksum;</p><p> unsigned int sourceip;</p><p> unsigned int destip;</
119、p><p> }IP_HEADER,*PIP_HEADER;</p><p> typedef struct tagIP_OPT_HEADER{</p><p> unsigned char code;</p><p> unsigned char len;</p><p> unsigned char ptr;
120、</p><p> unsigned long addr[9];</p><p> }IP_OPT_HEADER,*PIP_OPT_HEADER;</p><p> typedef struct tagICMP_HEADER{</p><p> unsigned char type;</p><p> uns
121、igned char code;</p><p> unsigned short checksum;</p><p> unsigned short id;</p><p> unsigned short seq;</p><p> unsigned long timestamp;</p><p> }ICM
122、P_HEADER,*PICMP_HEADER;</p><p> #define DEF_PACKET_SIZE 32</p><p> #define MAX_PACKET_SIZE 1024</p><p> #define ICMP_ECHO 8</p><p> #define ICMP_ECHOREPLY 0</p&g
123、t;<p> #define IP_RECORD_ROUTER 7</p><p> void usageinfo(char *progname);</p><p> void FillIcmpData(char*icmp_data,int size);</p><p> USHORT CheckSum(USHORT *buf,int size
124、);</p><p> void DecodeIcmpHeader(char *buf,int ret,LPSOCKADDR_IN lpSin);</p><p> void DecodeIpHeader(char *buf,int bytes);</p><p><b> 附錄三:</b></p><p> #
125、include<winsock2.h></p><p> #include<ws2tcpip.h></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #define MCASTADDR "233.0.
126、0.1"</p><p> #define MCASTPORT 5150</p><p> #define BUFSIZE 1024</p><p> int main(int argc,char **argv)</p><p><b> {</b></p><p> WSAD
127、ATA wsd;</p><p> struct sockaddr_in local,remote,from;</p><p> SOCKET sock,sockM;</p><p> TCHAR recvbuf[BUFSIZE];</p><p> int len=sizeof(struct sockaddr_in);</p&
128、gt;<p><b> int ret;</b></p><p> if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)</p><p><b> {</b></p><p> printf("WSAStartup() failed\n");</
129、p><p> return -1;</p><p><b> }</b></p><p> if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED))==</p><p> INVALI
130、D_SOCKET)</p><p><b> {</b></p><p> printf("socket failed with:%d\n",WSAGetLastError());</p><p> WSACleanup();</p><p> return -1;</p>&l
131、t;p><b> }</b></p><p> local.sin_family=AF_INET;</p><p> local.sin_port=htons(MCASTPORT);</p><p> local.sin_addr.s_addr=INADDR_ANY;</p><p> if(bind(s
132、ock,(struct sockaddr*)&local,sizeof(local))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("bind failed with :%d",WSAGetLastError());</p><p> closesocke
133、t(sock);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b></p><p> remote.sin_family=AF_INET;</p><p> remote.sin_port=htons(MCASTP
134、ORT);</p><p> remote.sin_addr.s_addr=inet_addr(MCASTADDR);</p><p> if((sockM=WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH))==INVALID_SOCKET)</p>&l
135、t;p><b> {</b></p><p> printf("WSAJoinLeaf() failed:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p><p> retu
136、rn -1;</p><p><b> }</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if((ret=recvfrom(sock,recvbuf,BUFSIZE,0,(struct sockadd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論