目錄
1. UDP和TCP的區(qū)別
2. UDP的工作原理
3. UDP存在數(shù)據(jù)邊界
4. UDP的I/O函數(shù)
4.1 sendto函數(shù)
4.2 recvfrom函數(shù)
4. 已連接(connected)UDP套接字和未連接(unconnected)UDP套接字
5. UDP的通信流程
5.1 服務器端通信流程
5.2 客戶端通信流程
1. UDP和TCP的區(qū)別
主要區(qū)別:
- TCP和UDP的主要區(qū)別是,TCP具有流控制機制,而UDP沒有。
- UDP性能比TCP高,在數(shù)據(jù)量大的情況下,TCP的性能會接近UDP的性能,但無法超過UDP。
TCP比UDP慢的原因主要如下:
??????? 1. 收發(fā)數(shù)據(jù)前后進行的連接設置及清除過程
??????? 2. 收發(fā)數(shù)據(jù)過程中為保證可靠性而添加的流控制
???? 3. UDP不如TCP可靠,有可能會發(fā)生數(shù)據(jù)的丟失。
2. UDP的工作原理
如圖,IP的作用是讓數(shù)據(jù)準確傳到主機A,而UDP的最重要的作用就是把數(shù)據(jù)準確的傳到主機A的指定套接字上。
3. UDP存在數(shù)據(jù)邊界
為什么說UDP存在數(shù)據(jù)邊界?
因為:
??????? 1.與TCP不同,UDP的通信過程中,I/O函數(shù)的調用次數(shù)必須保持一致,即客戶端sendto了幾次,服務器端也要recvfrom幾次。
??????? 2.同時也因為UDP每次傳輸?shù)臄?shù)據(jù)包又稱為UDP數(shù)據(jù)報,數(shù)據(jù)報也是數(shù)據(jù)包的一種,不同的是,UDP數(shù)據(jù)報本身可以成為1個完整的數(shù)據(jù),而TCP的一個完整的數(shù)據(jù)可以由多個數(shù)據(jù)包組成。
4. UDP的I/O函數(shù)
4.1 sendto函數(shù)
#include<sys/socket.h>
ssize_t sendto(
int sock, //用于傳輸數(shù)據(jù)的UDP套接字文件描述符
void *buff, //保存待傳輸數(shù)據(jù)的緩沖地址值
size_t nbytes, //待傳輸?shù)臄?shù)據(jù)長度,以字節(jié)為單位
int flags, //可選項參數(shù),沒有就設置為0
struct sockaddr* to, //存有目標地址信息的sockaddr結構體變量的地址值
socklen_t addrlen //傳遞給參數(shù)to的地址值結構體變量長度
);
成功返回傳輸?shù)淖止?jié)數(shù),失敗返回-1
UDP的套接字不會保持連接狀態(tài),因此每次傳輸數(shù)據(jù)都要添加目標地址信息。
4.2 recvfrom函數(shù)
#include<sys/socket.h>
ssize_t recvfrom(
int sock, //用于接收數(shù)據(jù)的UDP套接字文件描述符
void* buff, //保存接收數(shù)據(jù)的緩沖地址值
size_t nbytes, //可接受的最大字節(jié)數(shù),無法超過buff的大小
int flags, //可選項參數(shù),沒有則傳0
struct sockaddr* from, //存有發(fā)送端地址信息的sockaddr結構體變量的地址值
socklen_t *addrlen //保存參數(shù)from的結構體變量長度的地址值
);
4. 已連接(connected)UDP套接字和未連接(unconnected)UDP套接字
已連接UDP套接字:執(zhí)行了connect函數(shù)或bind函數(shù),套接字綁定了某主機IP和端口號
未連接UDP套接字:未執(zhí)行connect函數(shù)或bind函數(shù),套接字在每次執(zhí)行sendto函數(shù)時,再綁定某主機IP和端口號。
UDP中通過sendto函數(shù)傳輸數(shù)據(jù)可分為三個階段:
- 第一階段:向UDP套接字注冊目標IP和端口號
- 第二階段:傳輸數(shù)據(jù)
- 第三階段:刪除UDP套接字中注冊的目標信息地址
所以,未連接UDP套接字,可以重復利用同一個UDP套接字,向不同主機傳輸數(shù)據(jù)。但如果你每次都是向同一個主機傳輸多次,那么上述階段會重復多次,這樣會大大的消耗程序性能,因為sendto函數(shù)的第一階段和第三階段占整個通信過程的1/3,所以,這種情況下,你可以使用已連接套接字,在sendto函數(shù)前就先調用connect函數(shù)或bind函數(shù),綁定IP和端口號,這樣sendto函數(shù)就會節(jié)省第一階段和第二階段的時間,提高程序效率。
5. UDP的通信流程
5.1 服務器端通信流程
第一步:使用socket函數(shù)創(chuàng)建套接字
第二步:使用bind函數(shù)綁定IP地址和端口號(可以省略這一步,但如果是多次要與同一個主機通信,那么增加這一步可以增加性能)
第三步:使用sendto(或write)發(fā)送信息或recvfrom(或recv)接收信息(能使用send和recv的前提是已連接UDP套接字)
第四步:關閉套接字文章來源:http://www.zghlxwxcb.cn/news/detail-650037.html
和TCP不一樣,UDP無需執(zhí)行l(wèi)isten,accept函數(shù),可以不執(zhí)行bind函數(shù)。
5.2 客戶端通信流程
第一步:使用socket函數(shù)創(chuàng)建套接字
第二步:使用connect函數(shù)連接IP地址和端口號(可以省略這一步,但如果是多次要與同一個主機通信,那么增加這一步可以增加性能)
第三步:使用sendto(或write)發(fā)送信息或recvfrom(或recv)接收信息(能使用send和recv的前提是已連接UDP套接字)
第四步:關閉套接字
和TCP不一樣,UDP可以不執(zhí)行connect函數(shù),連接服務器端。文章來源地址http://www.zghlxwxcb.cn/news/detail-650037.html
到了這里,關于[C++ 網(wǎng)絡協(xié)議編程] UDP協(xié)議的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!