00. 目錄
01. 概述
02. udp程式設計c/s結構
03. udp常用函數
3.1 sendto函數
3.2 recvfrom函數
3.3 bind函數
04. 程式示例
4.1 udp用戶端
4.2 udp服務端
05. 附錄
udp 是 user datagram protocol 的簡稱, 中文名是使用者資料報協定,是一個簡單的面向資料報的傳輸層協定,在網絡中用于處理資料包,是一種無連接配接的協定。udp 不提供可靠性的傳輸,它隻是把應用程式傳給 ip 層的資料報發送出去,但是并不能保證它們能到達目的地。由于 udp 在傳輸資料報前不用在客戶和伺服器之間建立一個連接配接,且沒有逾時重發等機制,故而傳輸速度很快。
udp 有如下的特點:
1)郵件系統服務模式的抽象(可通過郵件模型來進行對比)
2)每個分組都攜帶完整的目的位址
3)發送資料之前不需要建立連結
4)不對資料包的順序進行檢查,不能保證分組的先後順序
5)不進行分組出錯的恢複和重傳
6)不保證資料傳輸的可靠性
在網絡品質令人十分不滿意的環境下,udp 協定資料包丢失會比較嚴重。但是由于 udp 的特性:它不屬于連接配接型協定,因而具有資源消耗小,處理速度快的優點,是以通常音頻、視訊和普通資料在傳送時使用 udp 較多,因為它們即使偶爾丢失一兩個資料包,也不會對接收結果産生太大影響。比如我們聊天用的 icq 和 qq 就是使用的 udp 協定。
對于 udp用戶端程式設計流程,有點類似于寫信過程:找個郵政從業人員( socket() )->信封上寫上位址同時裡面裝上信件内容并且投遞(sendto() )-> ……還可以繼續寫信,或者,接收對方的回信(recvfrom() )……-> 打完收工(close() )。
對于 udp 伺服器程式設計流程, 有點類似于收信過程:找個郵政從業人員( socket() ) -> 确定信箱的位置:位址+信箱号(bind() )-> 等待對方的來信( recvfrom() )-> ……還可以回信(write() ),或者,繼續等待對方的來信……
udp 伺服器程式
udp網絡程式想要收取資料需什麼條件?
1)确定的 ip 位址
2)确定的端口(port)
這正如,我要收到别人寄過來的信,我必須告訴别人我的位址(ip),同時告訴别人我我的較高價的電梯大廈信箱号(端口)。
接收端使用 bind() 函數,來完成位址結構與 socket 套接字的綁定,這樣 ip、port 就固定了,發送端在 sendto 函數中指定接收端的 ip、port,就可以發送資料了。
參考示例:
對比于寫信模型,用戶端相當于寄信人,要想成功給人寄信,信封上必須寫上對方的位址。
udp用戶端注意事項:
1)本地ip、本地端口(我是誰)
2)目的ip、目的端口(發給誰)
3)在用戶端的代碼中,我們隻設定了目的ip、目的端口
4)用戶端的本地 ip、本地 port 是我們調用 sendto 的時候 linux 系統底層自動給用戶端配置設定的;配置設定端口的方式為随機配置設定,即每次運作系統給的 port 不一樣。