發(fā)送和接收數(shù)據(jù).ppt_第1頁
發(fā)送和接收數(shù)據(jù).ppt_第2頁
發(fā)送和接收數(shù)據(jù).ppt_第3頁
發(fā)送和接收數(shù)據(jù).ppt_第4頁
發(fā)送和接收數(shù)據(jù).ppt_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第五章,發(fā)送和接收數(shù)據(jù),通信應(yīng)用軟件設(shè)計(jì),2,目標(biāo),掌握本機(jī)字節(jié)順序以及網(wǎng)絡(luò)字節(jié)順序的區(qū)別 掌握C語言對齊規(guī)則以及由此導(dǎo)致的問題 掌握消息成幀的兩種方式:文本字符格式和數(shù)據(jù)結(jié)構(gòu)體方式。 掌握案例:一個(gè)簡單的投票系統(tǒng),3,概述,任何交換信息的程序都必須就如何編碼信息(表示為一個(gè)位序列)達(dá)成一致,即發(fā)送信息是以何種格式,接收者必須以同樣的信息格式進(jìn)行解析。這種關(guān)于通過通信信道交換的信息的形式和含義的協(xié)定稱為協(xié)議(protocol)。 大多數(shù)應(yīng)用程序協(xié)議是依據(jù)由字段(field)序列構(gòu)成的具體消息定義的。每個(gè)字段都包含一份特定的編碼為位序列的信息。應(yīng)用程序協(xié)議準(zhǔn)確指定了發(fā)送者如何排列這些序列,以及接

2、收者如何解釋或解析它們。 自定義協(xié)議和標(biāo)準(zhǔn)協(xié)議。,4,整數(shù)的大?。?),在某種意義上,所有類型的信息最終都將被編碼為固定大小的整數(shù)。 C語言定義的幾種整型:char short int long C語言沒有指定這些整型的存儲(chǔ)位數(shù)的準(zhǔn)確大小,而是把它留給實(shí)現(xiàn)來完成。因此整型存儲(chǔ)位數(shù)大小可能因平臺(tái)而異。 計(jì)算整型存儲(chǔ)位數(shù)的大小是:sizeof,以字節(jié)為單位,例如: sizeof(int)。,5,整數(shù)的大?。?),通過TCP連接發(fā)送32位整數(shù),在不同的平臺(tái)上可能存在不同的解釋,可以解釋為int,也可以解釋為long。 C99語言標(biāo)準(zhǔn)規(guī)范以一組可選類型的形式提供了一種解決方案:int8_t int16

3、_t int32_t int64_t。這樣可以有效地解決整數(shù)存儲(chǔ)位數(shù)不一致的問題。,6,c99,c99是在c89的基礎(chǔ)上發(fā)展起來的,增加了基本數(shù)據(jù)類型,關(guān)鍵字和一些系統(tǒng)函數(shù)等。其實(shí)在初學(xué)階段C89(ANSI C)和C99的區(qū)別是不易察覺的,所以不必太在意這個(gè)。 C99有一部分是對于大字符集的優(yōu)化,還加入了一些數(shù)據(jù)庫函數(shù),是C89之后的標(biāo)準(zhǔn),我們用的C是C89標(biāo)準(zhǔn)的,C+是C89編寫的,目前的C99標(biāo)準(zhǔn)其實(shí)在以前的編譯器中就或多或少的支持了,目前完全支持的有這些:GCC、Borland C+等。,7,8,字節(jié)排序(1),對于需要多個(gè)字節(jié)進(jìn)行編碼的整數(shù),必須回答以哪種順序發(fā)送字節(jié)的問題。 例如:1

4、23456787654321L的十六機(jī)制為0 x0000704885F926B1,00,00,70,48,B1,85,F9,26,大端,小端,9,字節(jié)排序(2),網(wǎng)絡(luò)字節(jié)順序:使用大端字節(jié)順序 本機(jī)字節(jié)順序:可能是大端也可能是小端順序存儲(chǔ)。 本機(jī)字節(jié)順序與網(wǎng)絡(luò)字節(jié)順序之間轉(zhuǎn)換函數(shù):htons htonl ntohs ntohl,10,符號性與符號擴(kuò)展,負(fù)數(shù)在C語言中采用補(bǔ)碼表示。 負(fù)數(shù)值賦給無符號的變量時(shí)將使負(fù)數(shù)的符號位變量值的一部分。 在計(jì)算表達(dá)式的值時(shí),首先要將變量的值加寬到本機(jī)(int)大小。例如 char a, b ; sizeof(a+b) 的值為4,11,手工編碼整數(shù),程序Brut

5、eForceCoding.c中的EncodeIntBigEndian使用大端表示法把任何給定的基本整數(shù)值作為指定字節(jié)數(shù)的序列存放在內(nèi)存中的指定位置。 DecodeIntBigEndian方法用于處理將給定長度的字節(jié)序列解碼為64位的整數(shù),并將其解釋為大端序列。 BruteForceCoding.c,12,在流中包裝TCP套接字(1),編碼多個(gè)字節(jié)的整數(shù)可以使用流的方式在TCP套接字上傳輸。 FILE工具流:通過fdopen()調(diào)用把一個(gè)或多個(gè)FILE流與套接字描述符相關(guān)聯(lián)。 FILE *fdopen(int socketdes, const char *mode); int fclose(FI

6、LE *stream); int fflush(FILE *stream); frwrite(.) fread(),13,在流中包裝TCP套接字(2),14,結(jié)構(gòu)覆蓋:對齊與填充(1),構(gòu)造包含二進(jìn)制數(shù)據(jù)(即多字節(jié)整數(shù))的消息的最常用的方法是把C結(jié)構(gòu)覆蓋在一塊內(nèi)存區(qū)域上,并直接分配給結(jié)構(gòu)的字段。 例如地址信息結(jié)構(gòu)如下: struct addressInfo uint16_t streetAddress; /街道編號 int16_t aptNumber; /公寓編號 uint32_t postalCode; /郵編 addrInfo;,15,結(jié)構(gòu)覆蓋:對齊與填充(2),發(fā)送結(jié)構(gòu)體信息 (假設(shè)結(jié)構(gòu)

7、體已經(jīng)賦值) addrInfo.streetAddress = htons( addrInfo.streetAddress ) addrInfo.aptNumber = htons( addrInfo. aptNumber ) addrInfo.postalCode = htonl( addrInfo. postalCode ) if(send(sock, &addrinfo, sizeof(addrinfo),0) != sizeof(addrinfo) .,16,結(jié)構(gòu)覆蓋:對齊與填充(3),使用結(jié)構(gòu)體來接收數(shù)據(jù),17,結(jié)構(gòu)覆蓋:對齊與填充(4),一個(gè)15字節(jié)的消息結(jié)構(gòu)體,sizeof(in

8、tegerMessage)為16字節(jié),而不是15字節(jié)。這是因?yàn)镃語言特定的對齊規(guī)則造成的。,18,C語言的對齊規(guī)則,數(shù)據(jù)結(jié)構(gòu)是最大限度地對齊,即任何一個(gè)結(jié)構(gòu)類型的變量的地址都可以被其最大的本機(jī)整型字段除盡。 類型為多字節(jié)的整數(shù)類型要與它們的大小對齊,即int32_t類型的變量開始地址總是可以被4除盡,而一個(gè)uint16_t的開始地址則保證可以被2除盡。,19,隱式字節(jié)填充,如果在oneByte字段與twoBytes字段之間插入一個(gè)字節(jié)的填充,那么就滿足了字節(jié)對齊規(guī)則。 由編譯器添加為填充的字節(jié)內(nèi)容是未定義的。發(fā)送者以16字節(jié)發(fā)送,而接收者以15字節(jié)接收,那么很可能出現(xiàn)不正確的結(jié)果。,20,顯式

9、字節(jié)填充,這個(gè)結(jié)構(gòu)在內(nèi)存中的布置方式與原來申明的integerMessage完全一樣,只不過程序員現(xiàn)在可以控制和訪問填充字節(jié)的內(nèi)容。,21,字符串和文本,可打?。@示)的字符串是表示信息的最常用的方式。 C語言的字符集為ASCII碼。漢子等多于一個(gè)字節(jié)進(jìn)行編碼的字符如何表示?C99擴(kuò)展標(biāo)準(zhǔn)定義了一種wchar_t(寬字符)類型,用于存儲(chǔ)可能為每個(gè)符號使用多個(gè)字節(jié)的字符集中的字符。 函數(shù)wcstombs和mbstowcs用于支持字節(jié)順序與wchar_t的數(shù)組之間進(jìn)行相互轉(zhuǎn)換。,22,位操作:編碼布爾值,位圖(bitmap)是編碼布爾信息的非常簡潔的方式。位圖的思想是:整數(shù)類型的每一個(gè)位都可以編碼

10、一個(gè)布爾值(0或1)。 掩碼(mask)是把一個(gè)或多個(gè)特定的位設(shè)置為1并且清除所有其他的位。 位運(yùn)算符 & | ,23,構(gòu)造、成幀和解析消息,案例:一個(gè)簡單的“投票”協(xié)議 客戶發(fā)送一條請求(request)消息給服務(wù)器,該消息包含候選人ID,請求類型,是否響應(yīng),投票數(shù)。,24,客戶端程序,步驟 建立TCP連接 將結(jié)構(gòu)體VoteInfo型數(shù)據(jù)編碼為發(fā)送字節(jié)序列 成幀并發(fā)送數(shù)據(jù) 接收返回響應(yīng)信息 解碼返回信息并打印,25,服務(wù)器程序,步驟 建立偵聽套接字 反復(fù)接受連接和處理信息 等待連接 在流中包裝套接字 接收并處理消息,直至連接關(guān)閉,26,成幀,成幀指的是允許接收者定位消息(或其一部分)的邊界的

11、普遍問題。 兩種常規(guī)技術(shù)可以讓接收者明確地查找消息的末尾: 基于定界符 顯式長度,27,基于定界符,通過唯一標(biāo)記指示消息的末尾。 基于定界符的方法的一個(gè)特例是:發(fā)送者發(fā)送消息后關(guān)閉連接,接收者在讀取消息的最后一個(gè)字節(jié)后,會(huì)接收到一個(gè)流結(jié)束標(biāo)志。 基于定界符的方法通常用于編碼為文本的消息。 基于定界符方法的缺點(diǎn)是:消息自身絕對不能包含定界符?;蛘卟捎棉D(zhuǎn)義符的方式,但這將導(dǎo)致發(fā)送者和接收者必須掃描消息的每個(gè)字符,效率較低。,28,顯式長度,在長度可變的字段或消息前附加一個(gè)長度字段,指出包含多少個(gè)字節(jié)。長度字段一般具有固定的大?。哼@會(huì)限制可以成幀的消息的最大大小。 顯式長度方法更簡單,一般用于二進(jìn)制消息編碼。,29,基于文本的消息編碼,

溫馨提示

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

評論

0/150

提交評論