




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、UDP 通信實(shí)驗(yàn)調(diào)試報(bào)告一、調(diào)試內(nèi)容:使用VC6.0作為開(kāi)發(fā)平臺(tái),采用C語(yǔ)言編寫(xiě)udp程序,實(shí)現(xiàn)兩臺(tái)PC機(jī)通過(guò)以太網(wǎng)口傳輸數(shù)據(jù)。兩臺(tái)PC機(jī),一臺(tái)運(yùn)行開(kāi)發(fā)程序,一臺(tái)運(yùn)行通信調(diào)試用端口精靈WizPort以太網(wǎng)口監(jiān)視器作為程序調(diào)試輔助工具。二、程序流程使用UDP通信程序運(yùn)行步驟:預(yù)先設(shè)置本機(jī)和目標(biāo)機(jī)的IP地址和端口號(hào)創(chuàng)建本機(jī)上的套接字socket將套接字與本機(jī)的IP地址和端口號(hào)綁定檢測(cè)套接字設(shè)備文件的讀寫(xiě)狀態(tài),接收和發(fā)送數(shù)據(jù)三、程序代碼簡(jiǎn)析用Compaq Visual Fortran 6編譯器可以調(diào)試程序#include #include #include #include #include #in
2、clude #include #include #include #include #include nser.hUdp應(yīng)用程序除了涉及到一般的C語(yǔ)言庫(kù)函數(shù),還涉及到window功能調(diào)用,套接字函數(shù)調(diào)用,所以在VC開(kāi)發(fā)平臺(tái)默認(rèn)的工程連接庫(kù)中加入ws2_32.lib。該庫(kù)對(duì)應(yīng)ws2_32.dll,提供了網(wǎng)絡(luò)相關(guān)API的支持,若使用其中的API,則應(yīng)該將ws2_32.lib加入工程。在工程-設(shè)置-連接選項(xiàng)卡下的工程選項(xiàng)中輸入ws2_32.lib(如上圖)。nser.h中定義了一些常用宏。#define NTD_IPADDR 10.1.19.198/ntd的ip地址#define NTD_PORT
3、3006 /nt的端口號(hào)#define LOCAL_IPADDR 10.1.19.199/源端的ip地址#define LOCAL_PORT 3007 /源端的端口號(hào)以上定義了目標(biāo)PC機(jī)和本地PC機(jī)的的IP地址和端口號(hào)。端口號(hào)設(shè)置在10244096之間。WSADATA wsadata;WSAStartup(0x101,&wsadata);先定義一個(gè)WSADATA結(jié)構(gòu)指針,用于記錄windows套接字的相關(guān)信息。WSADATA如下:TypedefstructWSAData WORD wVersion;/調(diào)用者使用的WS2_32D.LL的版本號(hào) WORD wHighVerion;/表示W(wǎng)S2_32
4、D.LL支持的最高版本charszDescriptionWSADESCRIPTION_LEN+1;charszSystemStatusWSASYS_STATUS_LEN+1; unsigned shortiMaxSockets;/表示最多可以打開(kāi)多少套接字 unsigned short IMaxUdpDg;/表示數(shù)據(jù)報(bào)的最大長(zhǎng)度char FAR* lpVendorInfro;/套接字廠商信息WSADATA使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。該函數(shù)的第一個(gè)參數(shù)指明程序請(qǐng)求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二
5、個(gè)參數(shù)返回請(qǐng)求的Socket的版本信息。當(dāng)一個(gè)應(yīng)用程序調(diào)用WSAStartup函數(shù)時(shí),操作系統(tǒng)根據(jù)請(qǐng)求的Socket版本來(lái)搜索相應(yīng)的Socket庫(kù),然后綁定找到的Socket庫(kù)到該應(yīng)用程序中。以后應(yīng)用程序就可以調(diào)用所請(qǐng)求的 Socket庫(kù)中的其它Socket函數(shù)了。該函數(shù)執(zhí)行成功后返回0。對(duì)各終端的IP地址結(jié)構(gòu)設(shè)置定義當(dāng)?shù)睾湍繕?biāo)套接字地址結(jié)構(gòu),指定使用的地址家族即地址格式,端口號(hào)碼,IP地址。套接字地址結(jié)構(gòu)用于解決TCP/IP尋址。套接字結(jié)構(gòu)體類(lèi)型的定義:structsockaddr_in short sin_family; /指定地址家族即地址格式u_shortsin_port; /端口號(hào)碼
6、structin_addrsin_addr; /IP地址 char sin_zero8; /留作備用,需要指定為0我們用0來(lái)填充sin_zero數(shù)組,目的是讓sockaddr_in結(jié)構(gòu)的大小與sockaddr結(jié)構(gòu)的大小一致。;其中,結(jié)構(gòu)體類(lèi)型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;/使用此變量進(jìn)行描述IP地址 定義本機(jī)和目標(biāo)機(jī)的套接字地址結(jié)構(gòu)體:structsockaddr_inntd_ip;s
7、tructsockaddr_inlocal_ip;下面是對(duì)目標(biāo)機(jī)IP地址結(jié)構(gòu)體的賦值:ntd_ip.sin_family=AF_INET;/指定程序所使用的地址家族是TCP/IPntd_ip.sin_port=htons(unsigned short)NTD_PORT);/htons()將端口號(hào)整數(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,表示地址錯(cuò) 誤,
8、打印ntd地址錯(cuò)誤提示,退出程序printf(ntdinet_addr errorn);err_exit();對(duì)本機(jī)機(jī)IP地址結(jié)構(gòu)體的賦值和目標(biāo)機(jī)的方法相同,只是參數(shù)不一樣。創(chuàng)建udp套接字SOCKET socket(intaf,int type,int protocol)應(yīng)用程序調(diào)用socket函數(shù)來(lái)創(chuàng)建一個(gè)能夠進(jìn)行網(wǎng)絡(luò)通信的套接字。第一個(gè)參數(shù)指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,對(duì)于TCP/IP協(xié)議族,該參數(shù)置PF_INET;第二個(gè)參數(shù)指定要?jiǎng)?chuàng)建的套接字類(lèi)型,流套接字類(lèi)型為SOCK_STREAM、數(shù)據(jù)報(bào)套接字類(lèi)型為SOCK_DGRAM;第三個(gè)參數(shù)指定應(yīng)用程序所使用的通信協(xié)議。該函數(shù)如果調(diào)用成
9、功就返回新創(chuàng)建的套接字的描述符,如果失敗就返回INVALID_SOCKET(-1)。創(chuàng)建套接字使用的函數(shù)socket(AF_INET,SOCK_DGRAM,0)。類(lèi)型為int的udp_fd是在主函數(shù)入口處定義的套接字句柄即套接字描述符變量。if(udp_fd = socket(AF_INET,SOCK_DGRAM,0) 0) printf(udp socket errorn);err_exit();/創(chuàng)建失敗就退出將本機(jī)套接字綁定到指定的端口和地址上int bind(SOCKET s,conststructsockaddr FAR *name,intnamelen)當(dāng)創(chuàng)建了一個(gè)Socket以后
10、,套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中有一個(gè)默認(rèn)的IP地址和默認(rèn)的端口號(hào)。一個(gè)服務(wù)程序必須調(diào)用bind函數(shù)來(lái)給其綁定一個(gè)IP地址和一個(gè)特定的端口號(hào)。戶(hù)程序一般不必調(diào)用bind函數(shù)來(lái)為其Socket綁定IP地址和端口號(hào)。該函數(shù)的第一個(gè)參數(shù)指定待綁定的Socket描述符;第二個(gè)參數(shù)指定一個(gè)sockaddr結(jié)構(gòu);第三個(gè)參數(shù)表示綁定的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)長(zhǎng)度。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)用時(shí)傳遞來(lái)的socket句柄。循環(huán)過(guò)程使用到文件描述符的處理。1、先定義兩個(gè)用于可讀和可寫(xiě)檢測(cè)的文件描述符集,并將socket句柄加入這兩個(gè)集合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)。對(duì)每一個(gè)套接口,調(diào)用者可查詢(xún)它的可讀性、可寫(xiě)性及錯(cuò)誤狀態(tài)信息。select()調(diào)用返回處于就緒狀態(tài)并且已經(jīng)包含在fd_set結(jié)構(gòu)中的描述字總數(shù);如果超時(shí)則返回0;否則的話(huà),返回SOCKET_ERROR錯(cuò)誤,應(yīng)用程序可通過(guò)WSAGetLastError獲取相應(yīng)錯(cuò)誤代碼。當(dāng)返回位-1時(shí),所有描述符集清0。當(dāng)返回為0時(shí),超時(shí)不修改任何描述符集。當(dāng)返回為非0時(shí),在3個(gè)描述符集里,依舊是1的位就是準(zhǔn)備好的描述符。這時(shí)要用FD_ISSET ()函數(shù)來(lái)檢測(cè)fd在fdset集合中的狀態(tài)是否變化并返回整型,當(dāng)檢測(cè)到fd狀態(tài)發(fā)生變化時(shí)返回真,否則,返回假(0)ret = sele
13、ct(fd+1, &readable, &writeable, NULL, &tm)if(ret = 0) /超時(shí),不修改任何字符集,繼續(xù)循環(huán)continue;if(ret = SOCKET_ERROR)/-1錯(cuò)誤,程序退出 printf(select errorn);closesocket(fd);err_exit();if(FD_ISSET(fd, &readable)/socket的可讀性檢查及讀取和打印操作if(FD_ISSET(fd, &writeable)/socket的可寫(xiě)性檢查及發(fā)送操作三、與端口精靈的通信測(cè)試 測(cè)試結(jié)果:一端運(yùn)行程序,另一端運(yùn)行調(diào)試助手進(jìn)行測(cè)試如下:2)運(yùn)行端口精靈側(cè):本機(jī)IP:10.1.19.198注意:發(fā)送數(shù)據(jù)的顯示:查看顯示方式ASII碼對(duì)端程序運(yùn)行后,即接收到20個(gè)字符1點(diǎn)擊工具以太網(wǎng)定時(shí)發(fā)送再次點(diǎn)擊工具以太網(wǎng)定時(shí)發(fā)送,則取消發(fā)送3)運(yùn)行程序側(cè):本機(jī)IP:10.1.19.199程序中的IP地址如
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政法學(xué)知識(shí)拓展試題及答案解析
- 2025年VB考試全解及試題及答案
- 經(jīng)典法學(xué)概論考題試題及答案
- 醫(yī)院整體規(guī)劃與未來(lái)發(fā)展方向計(jì)劃
- 2025珠寶首飾等質(zhì)押合同
- 門(mén)診部護(hù)士長(zhǎng)工作計(jì)劃
- 2025年網(wǎng)絡(luò)管理員考試評(píng)估標(biāo)準(zhǔn)試題及答案
- 2025年考試過(guò)來(lái)人的建議試題及答案
- AI驅(qū)動(dòng)的智能應(yīng)用開(kāi)發(fā)試題及答案
- 行政管理人本思想試題及答案
- 超全QC管理流程圖
- 電氣自動(dòng)化技術(shù)專(zhuān)業(yè)人才需求崗位分析及崗位職責(zé)能力分析報(bào)告
- 化工廠“三劑”管理辦法
- 嬰幼兒配方奶粉常見(jiàn)問(wèn)題問(wèn)與答
- DB14T 2655-2023 公路鐵尾礦集料混凝土施工技術(shù)規(guī)程
- 電路(1)智慧樹(shù)知到答案章節(jié)測(cè)試2023年山東大學(xué)
- 2023年衡水市小升初英語(yǔ)考試模擬試題及答案解析
- 繼電保護(hù)裝置整定記錄
- GB/T 27813-2011無(wú)水氟化鉀分析方法
- GB/T 19869.1-2005鋼、鎳及鎳合金的焊接工藝評(píng)定試驗(yàn)
- 上海高一數(shù)學(xué)教材電子版
評(píng)論
0/150
提交評(píng)論