




已閱讀5頁,還剩7頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
電子科技大學通信學院套接字接口函數實驗報告班 級 2011221010 學 生 熊澤瞳 劉炎宏 學 號 2011221010020(熊澤瞳) 2011221010010(劉炎宏) 教 師 段景山 2004年9月套接字接口函數【實驗目的】掌握套接字接口函數的正確使用方法了解接口函數使用中可能出現的錯誤及解決方法【實驗環境】單人實驗,或兩人聯網配合實驗。【實驗原理】見本實驗指導書相關內容【實驗步驟及記錄】注意:本實驗測試各種套接字函數時,均使用如下形式判斷函數執行是否成功和取得錯誤碼,再通過查閱教材了解錯誤碼的具體含義:retval = xxxx( ); / xxxx( )表示被測試的套接字函數if( retval = = SOCKET_ERROR) /或者if ( retval != 0)r = WSAGetLastError(); /r中取得錯誤碼。每次測試完畢后,使用菜單中debug/stop debug選項使測試停止下來,如果沒有特殊說明,都應把測試對象恢復到測試前的正常狀態,以免影響下一個測試內容。l 面向連接服務器的各接口函數:socket、bind、listen、accept、send、recv、closesocket1、socket( )打開例程中面向連接服務器工程1) 測試參數1。測試目標:使用AF_ISO,或其它不是AF_INET家族的標識,注意:使用單步調試方法取得測試結果。參數1的值 AF_ISO ,s 的值: 4294967295 ,r取得的錯誤碼 10047 ,錯誤含義 WSAEAFNOSUPPORT 地址家族不支持請求的操作。對套接字類型不支持的操作來說,在試著執行它時,就會出現這個錯誤。 。2) 測試參數2。使用非標準套接字類型,如:6。記錄錯誤提示。參數1的值 AF_INET ,retval 的值: -1 ,r取得的錯誤碼 10044 ,錯誤含義 WSAESOCKTNOSUPPORT 不支持的套接字類型。對指定的地址家族來說,沒有相應的具體套接字類型支持。 。3) 測試參數3。一般情況下,不特別指明使用協議類型時使用0。現在分別使用不同的協議號測試并記錄:參數2:SOCK_STREAM,參數3:6retval 的值: 0 ,r取得的錯誤碼 -858993560 ,錯誤含義 r錯誤碼變量是沒有初始化,沒有錯誤 。參數2:SOCK_STREAM,參數3:7retval 的值: -1 ,r取得的錯誤碼 10043 ,錯誤含義 WSAEPROTONOSUPPORT 不支持的協議。系統中沒有安裝請求的協議或沒有相應的實施方案。 。參數2:SOCK_DGRAM,參數3:17retval 的值: 0 ,r取得的錯誤碼 -858993560 ,錯誤含義 r錯誤碼變量是沒有初始化,沒有錯誤 。參數2:SOCK_DGRAM,參數3:19retval 的值: -1 ,r取得的錯誤碼 10043 ,錯誤含義 WSAEPROTONOSUPPORT 不支持的協議。系統中沒有安裝請求的協議或沒有相應的實施方案。 。結論:socket()函數的三個參數主要用于定義協議家族,套接字類型以及協議類型。如果當前環境不支持相應的類型,則socket()會返回失敗。2、bind( )1) 測試參數1。測試目標:使用尚未申請套接字資源的套接字描述符,能否綁定套接字地址在s socket( );一句及相關的錯誤判斷等語句前加”/”方式變成注釋語句。觀察bind函數執行的結果。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。2) 測試參數2。測試目標:在套接字地址中分別使用不正確的地址族標識、本地IP地址和端口號測試。a、在local結構中,sin_family成員賦值為AF_OSI,retval 的值: -1 ,r取得的錯誤碼 10047 ,錯誤含義 WSAEAFNOSUPPORT 地址家族不支持請求的操作。對套接字類型不支持的操作來說,在試著執行它時,就會出現這個錯誤。 。b、在local結構中,sin_addr成員賦值為本計算機的IP地址,retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。c、在local結構中,sin_addr成員賦值為非本計算機的IP地址,如同小組的另一個同學的IP地址;retval 的值: -1 ,r取得的錯誤碼 10049 ,錯誤含義 WSAEADDRNOTAVAIL 不能分配請求的地址。A P I 調用中指定的地址對那個函數來說無效時,就會產生這樣的錯誤。 。d、在local結構中,sin_port成員賦值為135;retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。思考:什么樣的端口值會導致出錯?。如果試圖bind()已經分配給其他進程的端口則會出錯。一般寫程序,不用選擇1024之前的端口。3) 測試參數3。參數3:10retval 的值: -1 ,r取得的錯誤碼 10014 ,錯誤含義 WSAEFAULT地址無效。傳給Wi n s o c k 函數的指針地址無效。 參數3:16retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。參數3:40retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。思考:什么樣的套接字地址結構大小是不正確的?因為表示地址信息的結構有很多,為了保持兼容,第三個參數的結構大小會用于判斷地址結構版本的用途,當給定的地址結構大小不能正常識別出地址信息就會出錯吧。bind函數的測試結論:bind()函數僅僅表示網絡編程模型的一個基本操作,不僅僅是tcpip使用。因此保證參數的正確能使bind()正常工作。bind()需要的參數是分配好資源的套接字標識符以及地址信息。3、listen( )1) 測試參數1。測試目標:使用尚未建立本地半相關的套接字預測測試結果:(可從winsock.h的錯誤代碼列表中找出可能的錯誤類型,然后再用實驗證明。)將bind()一句及相關判錯的語句前面加“/”方式變成注釋語句后測試retval 的值: -1 ,r取得的錯誤碼 10022 ,錯誤含義 WSAEINVAL參數無效。指定了一個無效參數。 。2) 測試參數2。有文獻載明:“windows套接字實現中最多只允許服務器同時監聽5個套接字。使用參數0,則系統將把該參數改為1,而使用超過5的值,系統將自動把該參數改為5。”使用不同的參數值,測試實際效果,具體步驟如下:a、 設置listen()第2個參數的值b、 單步調試服務器程序,執行到listen下一句,即在錯誤判斷語句前c、 在例程目錄下有一個coclient.exe,雙擊執行,觀察客戶機與服務器連接的情況。(客戶機程序會打印連接結果)d、 同時執行多個coclient(不要關閉已經打印結果的客戶機),記錄有多少個客戶機能同時與服務器連接。設置參數值為0,有 1 個客戶機可同時與服務器連接設置參數值為1,有 1 個客戶機可同時與服務器連接設置參數值為10,有 5 個客戶機可同時與服務器連接思考,如果想結束套接字的監聽狀態,可以如何處理?closesocket()關閉套接字listen()函數的測試結論:listen()將會為分配好的服務器套接字監聽客戶端的連接,可以指定等待連接的數量,但是會有限制,但并不是5.4、accept( )1)測試參數1目標:能否在沒有設置為監聽狀態的套接字上接受連接將listen()一句設為注釋語句,然后測試retval 的值: -1 ,r取得的錯誤碼 10022 ,錯誤含義 10022 WSAEINVAL參數無效。 。2)測試參數2(這是一個輸出參數,其作用是告訴使用者遠端點地址。)測試目標:如果事先往遠端點地址結構(remote)里面填寫一個指定的遠端點地址,能夠限制服務器只接受這個遠端點的連接請求。步驟如下a、在調用accept之前,給remote(遠端點)的IP地址或端口號賦值,注意IP地址不指定為同小組另一個同學的地址,或端口號不是本地客戶機綁定的端口號(即,聯網實驗為非客戶機的IP地址,單機實驗為非客戶機的端口號)。注意:本實驗的客戶機(coclient.exe)端口為0x4321.b、將服務器單步調試到accept()阻塞。c、雙擊例程提供的coclient.exe,觀察是否能夠連接服務器。連接是否成功: 能 accept()執行后,remote內存放的IP地址為 127.0.0.1 ,端口號為 8515 。結論:(能否限制連接服務器的客戶機地址)不能限制3)測試參數3參數3的作用與bind()函數參數3一致,可同樣方法如0,15,16,40等值進行測試。accept函數的測試結論:accept()函數為已經處于監聽的服務器套接字選擇請求進行處理,返回新的連接的套接字。5、recv( )1)測試參數1目標:在一個沒有建立連接的套接字上嘗試接收數據。將accept一句改為注釋語句,并將recv()里的套接字標識符改為s,然后測試:retval 的值: -1 ,r取得的錯誤碼 10057 ,錯誤含義 WSAENOTCONN套接字尚未連接。 。2)測試參數2這是程序接收數據緩沖區指針,接收緩沖區要求程序設計者事先準備好的空間,即該指針已經指向一塊已經向系統申請,確定大小的空間。測試目標:如果不使用指向確定空間的指針,將會出現什么錯誤。a、在聲明接受緩沖區時,使用指針聲明而不是字符數組申明。 如 char * recvbuf;(字符數組聲明時向系統申請了一塊確定大小的空間,而字符串指針的聲明僅僅是表明該變量是一個指針而已)b、先啟動服務器,單步調試到accept后阻塞,再啟動coclient.exe程序c、繼續單步調試服務器,觀察recv()函數的錯誤情況。(或在recv()函數處設置調試斷點,使用F5鍵進行調試,可以節約一定時間)retval 的值: -1 ,r取得的錯誤碼 10014 ,錯誤含義 WSAEFAULT地址無效。傳給Wi n s o c k 函數的指針地址無效。若指定的緩沖區太小,也會產生這個錯誤。 。3)測試參數3此參數用于設置接收緩沖區的大小/長度。緩沖區長度參數可以小于等于程序員實際準備的緩沖區大小,但如果大于這個值,則可能造成不可預計的錯誤。測試目標:如果給出的接收緩沖區大小與緩沖區實際大小不一致時,會出現什么樣的錯誤。測試步驟同上。服務器上接收緩沖區以char recvbuf4方式申請4字節空間。a、客戶機在正確連接服務器并出現“請輸入”的提示后,輸入6個字符的字符串。b、recv()參數3使用0,4和10分別測試。參數3:0retval 的值: 0 ,r取得的錯誤碼 -858993460 ,recvbuf的內容 沒有初始化 。錯誤含義 沒有出錯 。參數3:4retval 的值: 4 ,r取得的錯誤碼 -858993460 ,recvbuf的內容 hhhh 。錯誤含義 沒有出錯 。參數3:10retval 的值: 10 ,r取得的錯誤碼 -858993460 ,recvbuf的內容 hhhh 。錯誤含義 沒有報錯 。系統是否出現其它錯誤: 沒有 。4)測試參數4在windows socket里flag可以是0,MSG_PEEK和MSG_OOB,一般設置為0。如果將flag設置為MSG_PEEK狀態,套接字上接收的數據不會因為用戶調用recv()而從緩沖隊列中消失,因此,當用戶下一次調用recv時,上一次的數據又重復出現了。測試目標:分別使用0和MSG_PEEK測試,對比測試結果。a、將服務器例程的recv()函數以以下語句代替retval = recv(ns,recvbuf,2,MSG_PEEK);recvbuf0 = 0;recvbuf1 = 0; /清空用戶緩沖區retval = recv(ns,recvbuf,2,0);b、在第一個recv處設置調試斷點。按F5鍵開始調試服務器;c、啟動coclient程序,連接服務器,并輸入2個字符的傳輸字符串d、繼續單步調試服務器,觀察兩個recv語句收到的字符串是否一致。參數4:0第一個recv()處retval 的值: 2 , recvbuf的內容 he 。第二個recv()處retval 的值: 2 , recvbuf的內容 ll 。參數4:MSG_PEEK第一個recv()處retval 的值: 2 , recvbuf的內容 he 。第二個recv()處retval 的值: 2 , recvbuf的內容 he 。recv()函數的測試結論:recv()提供了獲取數據的辦法以及一些控制參數。6、send()1)測試參數1測試目標:在沒有建立連接的套接字上嘗試發送數據。將accept()到recv()一段的語句都變成注釋語句,然后測試retval 的值: -1 ,r取得的錯誤碼 10057 ,錯誤含義 WSAENOTCONN套接字尚未連接。 。2)測試參數2顯然,發送數據的程序需要事先準備好待發的數據,并將這些數據放在一個緩沖區內。測試目標:如果用戶給出的指針沒有指向一個正確的緩沖區,會出現什么情況。a、將服務器例程發送緩沖區的聲明改為:char * sendbuf;b、將服務器例程send()函數改為:retval = send( ns, sendbuf, 3 , 0);c、在send()處設置調試斷點,啟動服務器調試。打開coclient.exe與服務器建立連接,并向服務器發送數據。d、繼續單步調試服務器,記錄send函數的返回值retval 的值: -1 ,r取得的錯誤碼 10014 ,錯誤含義 WSAEFAULT 地址無效。傳給Wi n s o c k 函數的指針地址無效。若指定的緩沖區太小,也會產生這個錯誤。 。3)測試參數3通過發送數據長度參數,程序員可以控制系統發送的數據量,即不一定將緩沖區的數據全部發送完。但是該長度不應該超過實際緩沖區的大小,否則造成不可預計的后果。測試目標:如果發送數據的長度與發送緩沖區實際大小不一致時,可能出現的后果。可以使用0,2,6等參數分別測試,同時觀察客戶機程序的打印結果。測試步驟同上。參數3:0retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有出錯 。參數3:2retval 的值: 2 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有出錯 。客戶機收到的數據 AC 。參數3:6retval 的值: 6 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有報錯 。客戶機收到的數據 ACK 。send()函數的測試結論發送數據,可以指定發送數據的大小。返回發送的大小。7、closesocket()這是一種“粗暴”的斷開連接方法。幾乎在任何時候都可以調用該函數以放棄對某個套接字的使用。1)測試參數1測試目標:關閉一個沒有申請套接字資源的套接字描述符會出怎樣的錯誤?重復關閉一個已經關閉的套接字描述符會出怎樣的錯誤?a、 在服務器例程的s = socket()前增加語句段:retval = closesocket(s);if(retval = SOCKET_ERROR)r = WSAGetLastError();記錄測試結果:retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。b、 在服務器例程的closesocket(ns);后再次關閉ns,測試并記錄結果:retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。closesocket()函數的測試結論l 面向連接客戶機的各接口函數:connect8、connect()在兩個VC環境里分別打開面向連接客戶機工程和面向連接服務器工程,在客戶機工程里完成以下實驗。1)測試函數執行情況測試目標:在沒有運行服務器的情況下,connect是否會一直阻塞?觀察connect的返回值。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。2)測試參數1測試目標:在一個沒有建立本地半相關(綁定)的套接字上能否成功連接服務器?a、將客戶機例程中填寫local內容和bind語句變成注釋語句b、啟動執行服務器c、單步調試客戶機,觀察能否建立連接。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。是否能正確建立連接 否 。3)測試參數2參數2是對方端點地址信息,可以使用一些特殊的地址來測試a、 使用遠端點IP地址為INADDR_ANY測試。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。b、 使用遠端點IP地址為10.1.1.255廣播地址。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。4)測試參數3參數3在上述幾個函數中都已經實驗過,有興趣的同學可以按照前面的方法測試一下。connect函數的測試結論:Connect()函數需要準確的服務器地址,否則無法建立連接。l 無連接方式下的接口函數:sendto、recvfrom分別在兩個VC中打開無連接服務器和無連接客戶機例程。可以現在服務器例程中測試recvfrom,然后在客戶機例程中測試sendto9、recvfrom( )本測試在無連接服務器中進行1)測試參數1無連接服務下,用戶程序可以直接發送或接收數據而不需要建立連接,但是有一個基本要求,即服務器仍必須確定自己的地址,并在該處等待客戶機的數據,以滿足客戶/服務器的通信模式。測試目標:如果在沒有建立本地半相關的套接字上,服務器是否能執行recvfrom等待數據的到來。打開無連接服務器工程,注釋bind語句,進入單步調試,并記錄recvfrom的執行情況:retval 的值: -1 ,r取得的錯誤碼 10022 ,錯誤含義 WSAEINVAL參數無效。指定了一個無效參數。 也可能表明套接字當前的狀態有錯 。2)測試參數5參數4是個輸出參數,用于告知用戶當前收到數據的源端點地址信息。測試目標:我們能否使用這個參數來指定從某個源端點處接收數據?在服務器例程的recvform函數之前,往remote結構里面填寫一個遠端點地址(注意不能是同小組同學的IP地址和端口地址,或本地客戶機的端口地址),測試能否指定(限制)僅從某個端點接受報文。a、填寫remote結構,b、啟動服務器單步調試c、啟動客戶機,向服務器發送數據,記錄recvfrom的相關數據retval 的值: 5 ,recv
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 淺論馬克思主義關+于人的全面發展思想簡析
- 介入個案護理比賽策劃與實施要點
- 違法強制拆除協議書
- 輸液致死糾紛協議書
- 飯店宴席預定協議書
- 養生館店長合同協議書
- 轉讓私人墓地協議書
- 酒店蛋糕采購協議書
- 酒店預定服務協議書
- 買賣合同和居間協議書
- (完整版)業務連續性計劃BCP
- 《期中考試家長會》PPT課件
- 工會文體活動管理制度范文
- 畢業論文某燃煤鍋爐房煙氣除塵脫硫系統設計
- 第6章_射線與物質的相互作用
- 3D打印介紹PPT精選文檔課件
- 近世代數期末試卷
- 鋼結構吊裝施工方案-
- 《藥品經營質量管理規范現場檢查指導原則》第二版培訓課件
- 電動汽車自用柱安裝承諾書
- 【機械畢業設計全套含CAD圖論文】麥田免耕施肥播種機設計
評論
0/150
提交評論