UDP通信程序調(diào)試報告_第1頁
UDP通信程序調(diào)試報告_第2頁
UDP通信程序調(diào)試報告_第3頁
UDP通信程序調(diào)試報告_第4頁
UDP通信程序調(diào)試報告_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、UDP 通信實驗調(diào)試報告一、調(diào)試內(nèi)容:使用VC6.0作為開發(fā)平臺,采用C語言編寫udp程序,實現(xiàn)兩臺PC機通過以太網(wǎng)口傳輸數(shù)據(jù)。兩臺PC機,一臺運行開發(fā)程序,一臺運行通信調(diào)試用端口精靈WizPort以太網(wǎng)口監(jiān)視器作為程序調(diào)試輔助工具。二、程序流程使用UDP通信程序運行步驟:預(yù)先設(shè)置本機和目標(biāo)機的IP地址和端口號創(chuàng)建本機上的套接字socket將套接字與本機的IP地址和端口號綁定檢測套接字設(shè)備文件的讀寫狀態(tài),接收和發(fā)送數(shù)據(jù)三、程序代碼簡析用Compaq Visual Fortran 6編譯器可以調(diào)試程序#include #include #include #include #include #in

2、clude #include #include #include #include #include nser.hUdp應(yīng)用程序除了涉及到一般的C語言庫函數(shù),還涉及到window功能調(diào)用,套接字函數(shù)調(diào)用,所以在VC開發(fā)平臺默認(rèn)的工程連接庫中加入ws2_32.lib。該庫對應(yīng)ws2_32.dll,提供了網(wǎng)絡(luò)相關(guān)API的支持,若使用其中的API,則應(yīng)該將ws2_32.lib加入工程。在工程-設(shè)置-連接選項卡下的工程選項中輸入ws2_32.lib(如上圖)。nser.h中定義了一些常用宏。#define NTD_IPADDR 10.1.19.198/ntd的ip地址#define NTD_PORT

3、3006 /nt的端口號#define LOCAL_IPADDR 10.1.19.199/源端的ip地址#define LOCAL_PORT 3007 /源端的端口號以上定義了目標(biāo)PC機和本地PC機的的IP地址和端口號。端口號設(shè)置在10244096之間。WSADATA wsadata;WSAStartup(0x101,&wsadata);先定義一個WSADATA結(jié)構(gòu)指針,用于記錄windows套接字的相關(guān)信息。WSADATA如下:TypedefstructWSAData WORD wVersion;/調(diào)用者使用的WS2_32D.LL的版本號 WORD wHighVerion;/表示W(wǎng)S2_32

4、D.LL支持的最高版本charszDescriptionWSADESCRIPTION_LEN+1;charszSystemStatusWSASYS_STATUS_LEN+1; unsigned shortiMaxSockets;/表示最多可以打開多少套接字 unsigned short IMaxUdpDg;/表示數(shù)據(jù)報的最大長度char FAR* lpVendorInfro;/套接字廠商信息WSADATA使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。該函數(shù)的第一個參數(shù)指明程序請求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二

5、個參數(shù)返回請求的Socket的版本信息。當(dāng)一個應(yīng)用程序調(diào)用WSAStartup函數(shù)時,操作系統(tǒng)根據(jù)請求的Socket版本來搜索相應(yīng)的Socket庫,然后綁定找到的Socket庫到該應(yīng)用程序中。以后應(yīng)用程序就可以調(diào)用所請求的 Socket庫中的其它Socket函數(shù)了。該函數(shù)執(zhí)行成功后返回0。對各終端的IP地址結(jié)構(gòu)設(shè)置定義當(dāng)?shù)睾湍繕?biāo)套接字地址結(jié)構(gòu),指定使用的地址家族即地址格式,端口號碼,IP地址。套接字地址結(jié)構(gòu)用于解決TCP/IP尋址。套接字結(jié)構(gòu)體類型的定義:structsockaddr_in short sin_family; /指定地址家族即地址格式u_shortsin_port; /端口號碼

6、structin_addrsin_addr; /IP地址 char sin_zero8; /留作備用,需要指定為0我們用0來填充sin_zero數(shù)組,目的是讓sockaddr_in結(jié)構(gòu)的大小與sockaddr結(jié)構(gòu)的大小一致。;其中,結(jié)構(gòu)體類型in_addr的定義如下:structin_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b;struct u_short s_w1,s_w2; S_un_w;u_longS_addr;/使用此變量進行描述IP地址 定義本機和目標(biāo)機的套接字地址結(jié)構(gòu)體:structsockaddr_inntd_ip;s

7、tructsockaddr_inlocal_ip;下面是對目標(biāo)機IP地址結(jié)構(gòu)體的賦值:ntd_ip.sin_family=AF_INET;/指定程序所使用的地址家族是TCP/IPntd_ip.sin_port=htons(unsigned short)NTD_PORT);/htons()將端口號整數(shù)轉(zhuǎn)換為大端模式的網(wǎng)絡(luò)字節(jié)序ntd_ip.sin_addr.s_addr=inet_addr(NTD_IPADDR);/把字符IP字符串轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序排列的IP地址if(ntd_ip.sin_addr.s_addr=INADDR_NONE) /若s_addr為0xffffffff,表示地址錯 誤,

8、打印ntd地址錯誤提示,退出程序printf(ntdinet_addr errorn);err_exit();對本機機IP地址結(jié)構(gòu)體的賦值和目標(biāo)機的方法相同,只是參數(shù)不一樣。創(chuàng)建udp套接字SOCKET socket(intaf,int type,int protocol)應(yīng)用程序調(diào)用socket函數(shù)來創(chuàng)建一個能夠進行網(wǎng)絡(luò)通信的套接字。第一個參數(shù)指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,對于TCP/IP協(xié)議族,該參數(shù)置PF_INET;第二個參數(shù)指定要創(chuàng)建的套接字類型,流套接字類型為SOCK_STREAM、數(shù)據(jù)報套接字類型為SOCK_DGRAM;第三個參數(shù)指定應(yīng)用程序所使用的通信協(xié)議。該函數(shù)如果調(diào)用成

9、功就返回新創(chuàng)建的套接字的描述符,如果失敗就返回INVALID_SOCKET(-1)。創(chuàng)建套接字使用的函數(shù)socket(AF_INET,SOCK_DGRAM,0)。類型為int的udp_fd是在主函數(shù)入口處定義的套接字句柄即套接字描述符變量。if(udp_fd = socket(AF_INET,SOCK_DGRAM,0) 0) printf(udp socket errorn);err_exit();/創(chuàng)建失敗就退出將本機套接字綁定到指定的端口和地址上int bind(SOCKET s,conststructsockaddr FAR *name,intnamelen)當(dāng)創(chuàng)建了一個Socket以后

10、,套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中有一個默認(rèn)的IP地址和默認(rèn)的端口號。一個服務(wù)程序必須調(diào)用bind函數(shù)來給其綁定一個IP地址和一個特定的端口號。戶程序一般不必調(diào)用bind函數(shù)來為其Socket綁定IP地址和端口號。該函數(shù)的第一個參數(shù)指定待綁定的Socket描述符;第二個參數(shù)指定一個sockaddr結(jié)構(gòu);第三個參數(shù)表示綁定的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)長度。if(bind(udp_fd , (structsockaddr *)&local_ip, sizeof(local_ip) 0)/失敗則返回-1printf(udp bind errorn);err_exit();/退出數(shù)據(jù)發(fā)送與接收循環(huán)void do_communic

11、ate(intfd)函數(shù)其中的形參fd是調(diào)用時傳遞來的socket句柄。循環(huán)過程使用到文件描述符的處理。1、先定義兩個用于可讀和可寫檢測的文件描述符集,并將socket句柄加入這兩個集合fd_setreadable,writeable;FD_ZERO(&readable);/將readable清零使集合中不含任何fdFD_ZERO(&writeable);/將writeable清零使集合中不含任何fdFD_SET(fd,&readable);/將socket句柄fd加入readable集合FD_SET(fd,&writeable);/將socket句柄fd加入readable集合2、程序使用s

12、lect()函數(shù)檢查套接口的狀態(tài)。對每一個套接口,調(diào)用者可查詢它的可讀性、可寫性及錯誤狀態(tài)信息。select()調(diào)用返回處于就緒狀態(tài)并且已經(jīng)包含在fd_set結(jié)構(gòu)中的描述字總數(shù);如果超時則返回0;否則的話,返回SOCKET_ERROR錯誤,應(yīng)用程序可通過WSAGetLastError獲取相應(yīng)錯誤代碼。當(dāng)返回位-1時,所有描述符集清0。當(dāng)返回為0時,超時不修改任何描述符集。當(dāng)返回為非0時,在3個描述符集里,依舊是1的位就是準(zhǔn)備好的描述符。這時要用FD_ISSET ()函數(shù)來檢測fd在fdset集合中的狀態(tài)是否變化并返回整型,當(dāng)檢測到fd狀態(tài)發(fā)生變化時返回真,否則,返回假(0)ret = sele

13、ct(fd+1, &readable, &writeable, NULL, &tm)if(ret = 0) /超時,不修改任何字符集,繼續(xù)循環(huán)continue;if(ret = SOCKET_ERROR)/-1錯誤,程序退出 printf(select errorn);closesocket(fd);err_exit();if(FD_ISSET(fd, &readable)/socket的可讀性檢查及讀取和打印操作if(FD_ISSET(fd, &writeable)/socket的可寫性檢查及發(fā)送操作三、與端口精靈的通信測試 測試結(jié)果:一端運行程序,另一端運行調(diào)試助手進行測試如下:2)運行端口精靈側(cè):本機IP:10.1.19.198注意:發(fā)送數(shù)據(jù)的顯示:查看顯示方式ASII碼對端程序運行后,即接收到20個字符1點擊工具以太網(wǎng)定時發(fā)送再次點擊工具以太網(wǎng)定時發(fā)送,則取消發(fā)送3)運行程序側(cè):本機IP:10.1.19.199程序中的IP地址如

溫馨提示

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

評論

0/150

提交評論