基于UDP協(xié)議的Socket編程課件_第1頁
基于UDP協(xié)議的Socket編程課件_第2頁
基于UDP協(xié)議的Socket編程課件_第3頁
基于UDP協(xié)議的Socket編程課件_第4頁
基于UDP協(xié)議的Socket編程課件_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于UDP協(xié)議的Socket編程,講課人:潘 煒 TelE-mail: 西北工業(yè)大學計算機學院,基于UDP協(xié)議的Socket編程,教學目的和重點,目的 掌握基于UDP協(xié)議的Socket編程方法 重點 基于UDP協(xié)議的Socket編程模型和程序設(shè)計流程,2,基于UDP協(xié)議的Socket編程,知識點,UDP協(xié)議的工作流程 基于UDP協(xié)議的Socket編程模型 服務器程序設(shè)計思路 客戶機程序設(shè)計思路 程序示例分析,3,基于UDP協(xié)議的Socket編程,UDP協(xié)議的特點,UDP協(xié)議的特點: UDP不要求保持一個連接 UDP沒有因接收方認可收到數(shù)據(jù)包(或當數(shù)據(jù)包沒有正確抵達而自

2、動重傳)而帶來的開銷。 設(shè)計UDP的目的是用于短應用和控制消息 UDP要求的網(wǎng)絡(luò)帶寬比TCP更小,4,基于UDP協(xié)議的Socket編程,使用UDP協(xié)議的場合,傳送的數(shù)據(jù)對順序和可靠性要求不高 簡單的發(fā)送接收的一次通信形式 傳輸?shù)臄?shù)據(jù)量較少 發(fā)送廣播或多播信息,5,基于UDP協(xié)議的Socket編程,打電話與發(fā)短信的區(qū)別,6,基于UDP協(xié)議的Socket編程,問題,透過現(xiàn)象看本質(zhì) 為什么一個人同時只能應付一個人打來的電話,而可以應付多個人的短信,7,基于UDP協(xié)議的Socket編程,UDP和TCP的區(qū)別,TCP 面向連接,完整的“流” UDP 無連接,一個一個獨立的報文 UDP和TCP的區(qū)別決定了

3、UDP的編程模式和TCP有很大差別,8,基于UDP協(xié)議的Socket編程,接收數(shù)據(jù)recvfrom(,基于UDP協(xié)議的Socket編程模型,服 務 器,綁定套接字bind(,客 戶 機,發(fā)送數(shù)據(jù)sendto(,綁定套接字bind(,數(shù)據(jù)傳輸,數(shù)據(jù)傳輸,關(guān)閉套接字closesocket(,創(chuàng)建套接字socket(,初始化套接字WSAStartup(,注銷套接字WSACleanup(,創(chuàng)建套接字socket(,初始化套接字WSAStartup(,發(fā)送數(shù)據(jù)sendto(,接收數(shù)據(jù)recvfrom(,關(guān)閉套接字closesocket(,注銷套接字WSACleanup(,模型(一,9,基于UDP協(xié)議的S

4、ocket編程,基于UDP協(xié)議的Socket編程模型,模型(一)的特點: 應用程序雙份是對等的。使用數(shù)據(jù)報套接字通信時都經(jīng)過6個階段: 初始化套接字接口 創(chuàng)建套接字 綁定套接字 發(fā)送/接收數(shù)據(jù),交換信息 關(guān)閉套接字 注銷套接字接口,10,基于UDP協(xié)議的Socket編程,基于UDP協(xié)議的Socket編程模型,模型(一)的特點: 雙方必須確切地知道對方的網(wǎng)絡(luò)地址,且將約定好的自己的網(wǎng)絡(luò)地址綁定到自己的套接字上。 每次發(fā)送或接收數(shù)據(jù)報時,所使用的sendto()和recvfrom()中要包括對方的網(wǎng)絡(luò)地址信息。 recvfrom()在沒有收到數(shù)據(jù)前,默認情況下會阻塞,程序不向下執(zhí)行,11,基于UD

5、P協(xié)議的Socket編程,接收數(shù)據(jù)recvfrom(,基于UDP協(xié)議的Socket編程模型,服 務 器,綁定套接字bind(,客 戶 機,發(fā)送數(shù)據(jù)sendto(,數(shù)據(jù)傳輸,數(shù)據(jù)傳輸,關(guān)閉套接字closesocket(,創(chuàng)建套接字socket(,初始化套接字WSAStartup(,注銷套接字WSACleanup(,創(chuàng)建套接字socket(,初始化套接字WSAStartup(,發(fā)送數(shù)據(jù)sendto(,接收數(shù)據(jù)recvfrom(,關(guān)閉套接字closesocket(,注銷套接字WSACleanup(,模型(二,12,基于UDP協(xié)議的Socket編程,基于UDP協(xié)議的Socket編程模型,模型(二)的特

6、點: 應用程序雙份是不對等的。服務器要先行啟動,處于被動的等待訪問狀態(tài);客戶機則可隨時主動請求訪問服務器。 完成一次通信時服務器要經(jīng)過6個階段: 初始化套接字接口 創(chuàng)建套接字 綁定套接字 發(fā)送/接收數(shù)據(jù),交換信息 關(guān)閉套接字 注銷套接字接口 而客戶機不需要綁定套接字,13,基于UDP協(xié)議的Socket編程,基于UDP協(xié)議的Socket編程模型,模型(二)的特點: 服務器將套接字綁定到周知的端口或指定的端口,且客戶機必須確切地知道服務器端套接字使用的網(wǎng)絡(luò)地址。 客戶機套接字使用動態(tài)分配的自由端口,不需要進行綁定。服務器事先不必知道客戶機套接字使用的網(wǎng)絡(luò)地址。 客戶機必須先發(fā)送數(shù)據(jù)報,服務器收到后

7、才能知道客戶機的地址,才能給客戶機回送數(shù)據(jù)報,14,基于UDP協(xié)議的Socket編程,UDP流程,socket(),創(chuàng)建套接字s,15,基于UDP協(xié)議的Socket編程,sendto(,發(fā)送一個數(shù)據(jù)報 int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); 返回值 成功:返回實際發(fā)送的字節(jié)數(shù) 失?。悍祷豐OCKET_ERROR,指定對端的 地址結(jié)構(gòu),指定對端的 地址結(jié)構(gòu)長度,16,基于UDP協(xié)議的Socket編程,recvfrom(

8、,接收一個數(shù)據(jù)報 int recvfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); 返回值 成功:返回實際接收的字節(jié)數(shù) 連接已終止:0 失?。悍祷豐OCKET_ERROR,接收發(fā)過來的 地址結(jié)構(gòu),17,基于UDP協(xié)議的Socket編程,問題,如果返回0,意味著什么,18,基于UDP協(xié)議的Socket編程,答案,TCP 字節(jié)流 可以發(fā)送0字節(jié)報文 若接收到0字節(jié),意味著連接被優(yōu)雅地關(guān)閉 UDP 數(shù)據(jù)報 可以發(fā)送0字節(jié)報文 若接收到0字節(jié),意味著報文長

9、度為0并關(guān)閉連接 recvfrom()和sendto()也可以用在TCP中 此時,接收到0字節(jié)意味著連接被優(yōu)雅地關(guān)閉 一般不這樣用,19,基于UDP協(xié)議的Socket編程,s = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in localaddr; memset(void *,程序范例 recvfrom(,20,基于UDP協(xié)議的Socket編程,SOCKET s; s = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in localaddr; memset(void *,程序范例 send

10、to(,21,基于UDP協(xié)議的Socket編程,示例1,示例1:利用基于UDP協(xié)議的Socket編程實現(xiàn)客戶機與服務器的簡單通信。 服務器啟動后將在8888號端口監(jiān)聽 客戶機啟動后主動連接服務器端并發(fā)送字符串“Hello” 服務器接收并顯示“Hello,服務器,客戶機,Hello,22,基于UDP協(xié)議的Socket編程,示例1,演示UdpClient程序與UdpServer程序間通信,23,基于UDP協(xié)議的Socket編程,TCP流程,accept,24,基于UDP協(xié)議的Socket編程,UDP流程,25,基于UDP協(xié)議的Socket編程,TCP編程模式,main() socket(); bi

11、nd(); listen(); accept();,thread() recv(); send();,thread() recv(); send();,thread() recv(); send();,main() socket(); connect(); send(); recv();,main() socket(); connect(); send(); recv();,main() socket(); connect(); send(); recv();,26,基于UDP協(xié)議的Socket編程,UDP編程模式,main() socket(); bind(); recvfrom(); se

12、ndto(); recvfrom(); sendto(); recvfrom(); sendto();,main() socket(); bind(); sendto(); recvfrom();,main() socket(); bind(); sendto(); recvfrom();,main() socket(); bind(); sendto(); recvfrom();,27,基于UDP協(xié)議的Socket編程,示例2,利用Socket編程實現(xiàn)基于UDP協(xié)議的廣播通信。 通信步驟: 創(chuàng)建數(shù)據(jù)報套接字,只有數(shù)據(jù)報套接字支持廣播通信。 綁定套接字于指定的地址和端口。 通過套接字選項設(shè)置數(shù)

13、據(jù)報套接字的廣播屬性。 通過sendto()函數(shù)發(fā)送廣播信息,只能使用sendto函數(shù),發(fā)送地址為INADDR_BROADCAST(廣播地址)。 通過recvfrom()函數(shù)接收廣播消息,28,基于UDP協(xié)議的Socket編程,示例2:演示UDP廣播發(fā)送數(shù)據(jù)的例子,宏定義INADDR_BROADCAST 表示廣播地址,即0 xFFFFFFFF,29,基于UDP協(xié)議的Socket編程,示例2:演示UDP廣播發(fā)送數(shù)據(jù)的例子,設(shè)置套接字選項函數(shù)setsockopt() int FAR setsockopt( SOCKET s, int level, int optname, const char F

14、AR *optval, int optlen); s:標識一個套接口的描述字。 level:選項定義的層次;支持SOL_SOCKET、IPPROTO_TCP、 IPPROTO_IP、 IPPROTO_IPv6層次。 optname:需設(shè)置的選項。 optval:指針,指向存放選項值的緩沖區(qū)。 optlen:optval緩沖區(qū)長度,30,基于UDP協(xié)議的Socket編程,示例2:演示UDP廣播發(fā)送數(shù)據(jù)的例子,選項設(shè)置: 讓Socket發(fā)送的數(shù)據(jù)具有廣播特性: BOOL bBroadcast=TRUE; setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const cha

15、r*,31,基于UDP協(xié)議的Socket編程,示例3,利用Socket編程實現(xiàn)基于UDP協(xié)議的多播通信。 通信步驟: 創(chuàng)建數(shù)據(jù)報套接字。 綁定套接字于指定的地址和端口。 通過套接字選項設(shè)置數(shù)據(jù)報套接字的多播屬性。 通過sendto()函數(shù)發(fā)送組播信息。 通過recvfrom()函數(shù)接收組播消息,32,基于UDP協(xié)議的Socket編程,示例3,利用Socket編程實現(xiàn)基于UDP協(xié)議的多播通信。 多播地址: 224.0.0.0224.0.0.255為預留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協(xié)議使用; 224.0.1.0224.0.1.255是公用組播地址,可

16、以用于Internet; 224.0.2.0238.255.255.255為用戶可用的組播地址(臨時組地址),全網(wǎng)范圍內(nèi)有效; 239.0.0.0239.255.255.255為本地管理組播地址,僅在特定的本地范圍內(nèi)有效,33,基于UDP協(xié)議的Socket編程,示例3,利用Socket編程實現(xiàn)基于UDP協(xié)議的組播通信。 IP多播組的加入和離開使用setsockopt()命令來完成: 選項IP_ADD_MEMBERSHIP是加入組; 選項IP_DROP_MEMBERSHIP是脫離組; 使用套接字選項時,必須傳遞一個ip_mreq結(jié)構(gòu) 定義: struct ip_mreq struct in_addr imr_multiaddr; /多播組 struct in_addr imr_interface; /本地IP地址,34,基于UDP協(xié)議的Socket編程,示例3,利用Socket編程實現(xiàn)基于UDP協(xié)議的組播通信。 IP多播組的加入和離開使用setsockopt()命令來完成: 選項IP_ADD_MEMBERSHIP是加入組: setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *,35,基于UDP協(xié)議的So

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論