套接字接口函數(shù)實驗報告.doc_第1頁
套接字接口函數(shù)實驗報告.doc_第2頁
套接字接口函數(shù)實驗報告.doc_第3頁
套接字接口函數(shù)實驗報告.doc_第4頁
套接字接口函數(shù)實驗報告.doc_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

電子科技大學通信學院套接字接口函數(shù)實驗報告班 級 2011221010 學 生 熊澤瞳 劉炎宏 學 號 2011221010020(熊澤瞳) 2011221010010(劉炎宏) 教 師 段景山 2004年9月套接字接口函數(shù)【實驗?zāi)康摹空莆仗捉幼纸涌诤瘮?shù)的正確使用方法了解接口函數(shù)使用中可能出現(xiàn)的錯誤及解決方法【實驗環(huán)境】單人實驗,或兩人聯(lián)網(wǎng)配合實驗?!緦嶒炘怼恳姳緦嶒炛笇嚓P(guān)內(nèi)容【實驗步驟及記錄】注意:本實驗測試各種套接字函數(shù)時,均使用如下形式判斷函數(shù)執(zhí)行是否成功和取得錯誤碼,再通過查閱教材了解錯誤碼的具體含義:retval = xxxx( ); / xxxx( )表示被測試的套接字函數(shù)if( retval = = SOCKET_ERROR) /或者if ( retval != 0)r = WSAGetLastError(); /r中取得錯誤碼。每次測試完畢后,使用菜單中debug/stop debug選項使測試停止下來,如果沒有特殊說明,都應(yīng)把測試對象恢復(fù)到測試前的正常狀態(tài),以免影響下一個測試內(nèi)容。l 面向連接服務(wù)器的各接口函數(shù):socket、bind、listen、accept、send、recv、closesocket1、socket( )打開例程中面向連接服務(wù)器工程1) 測試參數(shù)1。測試目標:使用AF_ISO,或其它不是AF_INET家族的標識,注意:使用單步調(diào)試方法取得測試結(jié)果。參數(shù)1的值 AF_ISO ,s 的值: 4294967295 ,r取得的錯誤碼 10047 ,錯誤含義 WSAEAFNOSUPPORT 地址家族不支持請求的操作。對套接字類型不支持的操作來說,在試著執(zhí)行它時,就會出現(xiàn)這個錯誤。 。2) 測試參數(shù)2。使用非標準套接字類型,如:6。記錄錯誤提示。參數(shù)1的值 AF_INET ,retval 的值: -1 ,r取得的錯誤碼 10044 ,錯誤含義 WSAESOCKTNOSUPPORT 不支持的套接字類型。對指定的地址家族來說,沒有相應(yīng)的具體套接字類型支持。 。3) 測試參數(shù)3。一般情況下,不特別指明使用協(xié)議類型時使用0?,F(xiàn)在分別使用不同的協(xié)議號測試并記錄:參數(shù)2:SOCK_STREAM,參數(shù)3:6retval 的值: 0 ,r取得的錯誤碼 -858993560 ,錯誤含義 r錯誤碼變量是沒有初始化,沒有錯誤 。參數(shù)2:SOCK_STREAM,參數(shù)3:7retval 的值: -1 ,r取得的錯誤碼 10043 ,錯誤含義 WSAEPROTONOSUPPORT 不支持的協(xié)議。系統(tǒng)中沒有安裝請求的協(xié)議或沒有相應(yīng)的實施方案。 。參數(shù)2:SOCK_DGRAM,參數(shù)3:17retval 的值: 0 ,r取得的錯誤碼 -858993560 ,錯誤含義 r錯誤碼變量是沒有初始化,沒有錯誤 。參數(shù)2:SOCK_DGRAM,參數(shù)3:19retval 的值: -1 ,r取得的錯誤碼 10043 ,錯誤含義 WSAEPROTONOSUPPORT 不支持的協(xié)議。系統(tǒng)中沒有安裝請求的協(xié)議或沒有相應(yīng)的實施方案。 。結(jié)論:socket()函數(shù)的三個參數(shù)主要用于定義協(xié)議家族,套接字類型以及協(xié)議類型。如果當前環(huán)境不支持相應(yīng)的類型,則socket()會返回失敗。2、bind( )1) 測試參數(shù)1。測試目標:使用尚未申請?zhí)捉幼仲Y源的套接字描述符,能否綁定套接字地址在s socket( );一句及相關(guān)的錯誤判斷等語句前加”/”方式變成注釋語句。觀察bind函數(shù)執(zhí)行的結(jié)果。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。2) 測試參數(shù)2。測試目標:在套接字地址中分別使用不正確的地址族標識、本地IP地址和端口號測試。a、在local結(jié)構(gòu)中,sin_family成員賦值為AF_OSI,retval 的值: -1 ,r取得的錯誤碼 10047 ,錯誤含義 WSAEAFNOSUPPORT 地址家族不支持請求的操作。對套接字類型不支持的操作來說,在試著執(zhí)行它時,就會出現(xiàn)這個錯誤。 。b、在local結(jié)構(gòu)中,sin_addr成員賦值為本計算機的IP地址,retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。c、在local結(jié)構(gòu)中,sin_addr成員賦值為非本計算機的IP地址,如同小組的另一個同學的IP地址;retval 的值: -1 ,r取得的錯誤碼 10049 ,錯誤含義 WSAEADDRNOTAVAIL 不能分配請求的地址。A P I 調(diào)用中指定的地址對那個函數(shù)來說無效時,就會產(chǎn)生這樣的錯誤。 。d、在local結(jié)構(gòu)中,sin_port成員賦值為135;retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。思考:什么樣的端口值會導致出錯?。如果試圖bind()已經(jīng)分配給其他進程的端口則會出錯。一般寫程序,不用選擇1024之前的端口。3) 測試參數(shù)3。參數(shù)3:10retval 的值: -1 ,r取得的錯誤碼 10014 ,錯誤含義 WSAEFAULT地址無效。傳給Wi n s o c k 函數(shù)的指針地址無效。 參數(shù)3:16retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。參數(shù)3:40retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有錯誤 。思考:什么樣的套接字地址結(jié)構(gòu)大小是不正確的?因為表示地址信息的結(jié)構(gòu)有很多,為了保持兼容,第三個參數(shù)的結(jié)構(gòu)大小會用于判斷地址結(jié)構(gòu)版本的用途,當給定的地址結(jié)構(gòu)大小不能正常識別出地址信息就會出錯吧。bind函數(shù)的測試結(jié)論:bind()函數(shù)僅僅表示網(wǎng)絡(luò)編程模型的一個基本操作,不僅僅是tcpip使用。因此保證參數(shù)的正確能使bind()正常工作。bind()需要的參數(shù)是分配好資源的套接字標識符以及地址信息。3、listen( )1) 測試參數(shù)1。測試目標:使用尚未建立本地半相關(guān)的套接字預(yù)測測試結(jié)果:(可從winsock.h的錯誤代碼列表中找出可能的錯誤類型,然后再用實驗證明。)將bind()一句及相關(guān)判錯的語句前面加“/”方式變成注釋語句后測試retval 的值: -1 ,r取得的錯誤碼 10022 ,錯誤含義 WSAEINVAL參數(shù)無效。指定了一個無效參數(shù)。 。2) 測試參數(shù)2。有文獻載明:“windows套接字實現(xiàn)中最多只允許服務(wù)器同時監(jiān)聽5個套接字。使用參數(shù)0,則系統(tǒng)將把該參數(shù)改為1,而使用超過5的值,系統(tǒng)將自動把該參數(shù)改為5?!笔褂貌煌膮?shù)值,測試實際效果,具體步驟如下:a、 設(shè)置listen()第2個參數(shù)的值b、 單步調(diào)試服務(wù)器程序,執(zhí)行到listen下一句,即在錯誤判斷語句前c、 在例程目錄下有一個coclient.exe,雙擊執(zhí)行,觀察客戶機與服務(wù)器連接的情況。(客戶機程序會打印連接結(jié)果)d、 同時執(zhí)行多個coclient(不要關(guān)閉已經(jīng)打印結(jié)果的客戶機),記錄有多少個客戶機能同時與服務(wù)器連接。設(shè)置參數(shù)值為0,有 1 個客戶機可同時與服務(wù)器連接設(shè)置參數(shù)值為1,有 1 個客戶機可同時與服務(wù)器連接設(shè)置參數(shù)值為10,有 5 個客戶機可同時與服務(wù)器連接思考,如果想結(jié)束套接字的監(jiān)聽狀態(tài),可以如何處理?closesocket()關(guān)閉套接字listen()函數(shù)的測試結(jié)論:listen()將會為分配好的服務(wù)器套接字監(jiān)聽客戶端的連接,可以指定等待連接的數(shù)量,但是會有限制,但并不是5.4、accept( )1)測試參數(shù)1目標:能否在沒有設(shè)置為監(jiān)聽狀態(tài)的套接字上接受連接將listen()一句設(shè)為注釋語句,然后測試retval 的值: -1 ,r取得的錯誤碼 10022 ,錯誤含義 10022 WSAEINVAL參數(shù)無效。 。2)測試參數(shù)2(這是一個輸出參數(shù),其作用是告訴使用者遠端點地址。)測試目標:如果事先往遠端點地址結(jié)構(gòu)(remote)里面填寫一個指定的遠端點地址,能夠限制服務(wù)器只接受這個遠端點的連接請求。步驟如下a、在調(diào)用accept之前,給remote(遠端點)的IP地址或端口號賦值,注意IP地址不指定為同小組另一個同學的地址,或端口號不是本地客戶機綁定的端口號(即,聯(lián)網(wǎng)實驗為非客戶機的IP地址,單機實驗為非客戶機的端口號)。注意:本實驗的客戶機(coclient.exe)端口為0x4321.b、將服務(wù)器單步調(diào)試到accept()阻塞。c、雙擊例程提供的coclient.exe,觀察是否能夠連接服務(wù)器。連接是否成功: 能 accept()執(zhí)行后,remote內(nèi)存放的IP地址為 127.0.0.1 ,端口號為 8515 。結(jié)論:(能否限制連接服務(wù)器的客戶機地址)不能限制3)測試參數(shù)3參數(shù)3的作用與bind()函數(shù)參數(shù)3一致,可同樣方法如0,15,16,40等值進行測試。accept函數(shù)的測試結(jié)論:accept()函數(shù)為已經(jīng)處于監(jiān)聽的服務(wù)器套接字選擇請求進行處理,返回新的連接的套接字。5、recv( )1)測試參數(shù)1目標:在一個沒有建立連接的套接字上嘗試接收數(shù)據(jù)。將accept一句改為注釋語句,并將recv()里的套接字標識符改為s,然后測試:retval 的值: -1 ,r取得的錯誤碼 10057 ,錯誤含義 WSAENOTCONN套接字尚未連接。 。2)測試參數(shù)2這是程序接收數(shù)據(jù)緩沖區(qū)指針,接收緩沖區(qū)要求程序設(shè)計者事先準備好的空間,即該指針已經(jīng)指向一塊已經(jīng)向系統(tǒng)申請,確定大小的空間。測試目標:如果不使用指向確定空間的指針,將會出現(xiàn)什么錯誤。a、在聲明接受緩沖區(qū)時,使用指針聲明而不是字符數(shù)組申明。 如 char * recvbuf;(字符數(shù)組聲明時向系統(tǒng)申請了一塊確定大小的空間,而字符串指針的聲明僅僅是表明該變量是一個指針而已)b、先啟動服務(wù)器,單步調(diào)試到accept后阻塞,再啟動coclient.exe程序c、繼續(xù)單步調(diào)試服務(wù)器,觀察recv()函數(shù)的錯誤情況。(或在recv()函數(shù)處設(shè)置調(diào)試斷點,使用F5鍵進行調(diào)試,可以節(jié)約一定時間)retval 的值: -1 ,r取得的錯誤碼 10014 ,錯誤含義 WSAEFAULT地址無效。傳給Wi n s o c k 函數(shù)的指針地址無效。若指定的緩沖區(qū)太小,也會產(chǎn)生這個錯誤。 。3)測試參數(shù)3此參數(shù)用于設(shè)置接收緩沖區(qū)的大小/長度。緩沖區(qū)長度參數(shù)可以小于等于程序員實際準備的緩沖區(qū)大小,但如果大于這個值,則可能造成不可預(yù)計的錯誤。測試目標:如果給出的接收緩沖區(qū)大小與緩沖區(qū)實際大小不一致時,會出現(xiàn)什么樣的錯誤。測試步驟同上。服務(wù)器上接收緩沖區(qū)以char recvbuf4方式申請4字節(jié)空間。a、客戶機在正確連接服務(wù)器并出現(xiàn)“請輸入”的提示后,輸入6個字符的字符串。b、recv()參數(shù)3使用0,4和10分別測試。參數(shù)3:0retval 的值: 0 ,r取得的錯誤碼 -858993460 ,recvbuf的內(nèi)容 沒有初始化 。錯誤含義 沒有出錯 。參數(shù)3:4retval 的值: 4 ,r取得的錯誤碼 -858993460 ,recvbuf的內(nèi)容 hhhh 。錯誤含義 沒有出錯 。參數(shù)3:10retval 的值: 10 ,r取得的錯誤碼 -858993460 ,recvbuf的內(nèi)容 hhhh 。錯誤含義 沒有報錯 。系統(tǒng)是否出現(xiàn)其它錯誤: 沒有 。4)測試參數(shù)4在windows socket里flag可以是0,MSG_PEEK和MSG_OOB,一般設(shè)置為0。如果將flag設(shè)置為MSG_PEEK狀態(tài),套接字上接收的數(shù)據(jù)不會因為用戶調(diào)用recv()而從緩沖隊列中消失,因此,當用戶下一次調(diào)用recv時,上一次的數(shù)據(jù)又重復(fù)出現(xiàn)了。測試目標:分別使用0和MSG_PEEK測試,對比測試結(jié)果。a、將服務(wù)器例程的recv()函數(shù)以以下語句代替retval = recv(ns,recvbuf,2,MSG_PEEK);recvbuf0 = 0;recvbuf1 = 0; /清空用戶緩沖區(qū)retval = recv(ns,recvbuf,2,0);b、在第一個recv處設(shè)置調(diào)試斷點。按F5鍵開始調(diào)試服務(wù)器;c、啟動coclient程序,連接服務(wù)器,并輸入2個字符的傳輸字符串d、繼續(xù)單步調(diào)試服務(wù)器,觀察兩個recv語句收到的字符串是否一致。參數(shù)4:0第一個recv()處retval 的值: 2 , recvbuf的內(nèi)容 he 。第二個recv()處retval 的值: 2 , recvbuf的內(nèi)容 ll 。參數(shù)4:MSG_PEEK第一個recv()處retval 的值: 2 , recvbuf的內(nèi)容 he 。第二個recv()處retval 的值: 2 , recvbuf的內(nèi)容 he 。recv()函數(shù)的測試結(jié)論:recv()提供了獲取數(shù)據(jù)的辦法以及一些控制參數(shù)。6、send()1)測試參數(shù)1測試目標:在沒有建立連接的套接字上嘗試發(fā)送數(shù)據(jù)。將accept()到recv()一段的語句都變成注釋語句,然后測試retval 的值: -1 ,r取得的錯誤碼 10057 ,錯誤含義 WSAENOTCONN套接字尚未連接。 。2)測試參數(shù)2顯然,發(fā)送數(shù)據(jù)的程序需要事先準備好待發(fā)的數(shù)據(jù),并將這些數(shù)據(jù)放在一個緩沖區(qū)內(nèi)。測試目標:如果用戶給出的指針沒有指向一個正確的緩沖區(qū),會出現(xiàn)什么情況。a、將服務(wù)器例程發(fā)送緩沖區(qū)的聲明改為:char * sendbuf;b、將服務(wù)器例程send()函數(shù)改為:retval = send( ns, sendbuf, 3 , 0);c、在send()處設(shè)置調(diào)試斷點,啟動服務(wù)器調(diào)試。打開coclient.exe與服務(wù)器建立連接,并向服務(wù)器發(fā)送數(shù)據(jù)。d、繼續(xù)單步調(diào)試服務(wù)器,記錄send函數(shù)的返回值retval 的值: -1 ,r取得的錯誤碼 10014 ,錯誤含義 WSAEFAULT 地址無效。傳給Wi n s o c k 函數(shù)的指針地址無效。若指定的緩沖區(qū)太小,也會產(chǎn)生這個錯誤。 。3)測試參數(shù)3通過發(fā)送數(shù)據(jù)長度參數(shù),程序員可以控制系統(tǒng)發(fā)送的數(shù)據(jù)量,即不一定將緩沖區(qū)的數(shù)據(jù)全部發(fā)送完。但是該長度不應(yīng)該超過實際緩沖區(qū)的大小,否則造成不可預(yù)計的后果。測試目標:如果發(fā)送數(shù)據(jù)的長度與發(fā)送緩沖區(qū)實際大小不一致時,可能出現(xiàn)的后果??梢允褂?,2,6等參數(shù)分別測試,同時觀察客戶機程序的打印結(jié)果。測試步驟同上。參數(shù)3:0retval 的值: 0 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有出錯 。參數(shù)3:2retval 的值: 2 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有出錯 ??蛻魴C收到的數(shù)據(jù) AC 。參數(shù)3:6retval 的值: 6 ,r取得的錯誤碼 -858993460 ,錯誤含義 沒有報錯 。客戶機收到的數(shù)據(jù) ACK 。send()函數(shù)的測試結(jié)論發(fā)送數(shù)據(jù),可以指定發(fā)送數(shù)據(jù)的大小。返回發(fā)送的大小。7、closesocket()這是一種“粗暴”的斷開連接方法。幾乎在任何時候都可以調(diào)用該函數(shù)以放棄對某個套接字的使用。1)測試參數(shù)1測試目標:關(guān)閉一個沒有申請?zhí)捉幼仲Y源的套接字描述符會出怎樣的錯誤?重復(fù)關(guān)閉一個已經(jīng)關(guān)閉的套接字描述符會出怎樣的錯誤?a、 在服務(wù)器例程的s = socket()前增加語句段:retval = closesocket(s);if(retval = SOCKET_ERROR)r = WSAGetLastError();記錄測試結(jié)果:retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。b、 在服務(wù)器例程的closesocket(ns);后再次關(guān)閉ns,測試并記錄結(jié)果:retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。closesocket()函數(shù)的測試結(jié)論l 面向連接客戶機的各接口函數(shù):connect8、connect()在兩個VC環(huán)境里分別打開面向連接客戶機工程和面向連接服務(wù)器工程,在客戶機工程里完成以下實驗。1)測試函數(shù)執(zhí)行情況測試目標:在沒有運行服務(wù)器的情況下,connect是否會一直阻塞?觀察connect的返回值。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。2)測試參數(shù)1測試目標:在一個沒有建立本地半相關(guān)(綁定)的套接字上能否成功連接服務(wù)器?a、將客戶機例程中填寫local內(nèi)容和bind語句變成注釋語句b、啟動執(zhí)行服務(wù)器c、單步調(diào)試客戶機,觀察能否建立連接。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。是否能正確建立連接 否 。3)測試參數(shù)2參數(shù)2是對方端點地址信息,可以使用一些特殊的地址來測試a、 使用遠端點IP地址為INADDR_ANY測試。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。b、 使用遠端點IP地址為10.1.1.255廣播地址。retval 的值: -1 ,r取得的錯誤碼 10038 ,錯誤含義 WSAENOTSOCK無效套接字上的套接字操作。 。4)測試參數(shù)3參數(shù)3在上述幾個函數(shù)中都已經(jīng)實驗過,有興趣的同學可以按照前面的方法測試一下。connect函數(shù)的測試結(jié)論:Connect()函數(shù)需要準確的服務(wù)器地址,否則無法建立連接。l 無連接方式下的接口函數(shù):sendto、recvfrom分別在兩個VC中打開無連接服務(wù)器和無連接客戶機例程。可以現(xiàn)在服務(wù)器例程中測試recvfrom,然后在客戶機例程中測試sendto9、recvfrom( )本測試在無連接服務(wù)器中進行1)測試參數(shù)1無連接服務(wù)下,用戶程序可以直接發(fā)送或接收數(shù)據(jù)而不需要建立連接,但是有一個基本要求,即服務(wù)器仍必須確定自己的地址,并在該處等待客戶機的數(shù)據(jù),以滿足客戶/服務(wù)器的通信模式。測試目標:如果在沒有建立本地半相關(guān)的套接字上,服務(wù)器是否能執(zhí)行recvfrom等待數(shù)據(jù)的到來。打開無連接服務(wù)器工程,注釋bind語句,進入單步調(diào)試,并記錄recvfrom的執(zhí)行情況:retval 的值: -1 ,r取得的錯誤碼 10022 ,錯誤含義 WSAEINVAL參數(shù)無效。指定了一個無效參數(shù)。 也可能表明套接字當前的狀態(tài)有錯 。2)測試參數(shù)5參數(shù)4是個輸出參數(shù),用于告知用戶當前收到數(shù)據(jù)的源端點地址信息。測試目標:我們能否使用這個參數(shù)來指定從某個源端點處接收數(shù)據(jù)?在服務(wù)器例程的recvform函數(shù)之前,往remote結(jié)構(gòu)里面填寫一個遠端點地址(注意不能是同小組同學的IP地址和端口地址,或本地客戶機的端口地址),測試能否指定(限制)僅從某個端點接受報文。a、填寫remote結(jié)構(gòu),b、啟動服務(wù)器單步調(diào)試c、啟動客戶機,向服務(wù)器發(fā)送數(shù)據(jù),記錄recvfrom的相關(guān)數(shù)據(jù)retval 的值: 5 ,recv

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論