如何找網(wǎng)站互聯(lián)網(wǎng)公司
1. UDP
UDP:用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol),傳輸層協(xié)議之一(UDP,TCP)
2. 特性? ? ? ? ?
- 發(fā)送數(shù)據(jù)時不需要建立鏈接,節(jié)省資源開銷
- 不安全不可靠的協(xié)議????????//一般用在實時性比較高的廣播,組播//VNC
- 面向報文。
- 資源開銷小
3.框架
3.1 C/S模式
有一個專用的客戶端 ?client----server
傳輸方式:用戶主機(jī)1--->服務(wù)器---->用戶主機(jī)2
框架設(shè)計
- server:socket() ===>bind()===>recvfrom()===>close()
- client:socket() ===>(bind())===>sendto() ===>close()
3.2 B/S模式
有一個通用的客戶端瀏覽器
browser----server
client:socket() ===>sendto() ===>close()
4. API接口
4.1 socket函數(shù)
套接字:通信對象的抽象, 網(wǎng)絡(luò)通信的端口,一個通信鏈的句柄。
????????int socket(int domain, int type, int protocol);
功能:
????????創(chuàng)建一個用來通信的接口(文件描述符)
參數(shù):
????????domain:通信的協(xié)議族(AF_INET:IPv4協(xié)議族)
type:
????????SOCK_DGRAM:數(shù)據(jù)報套接字?? ?(UDP使用此類型)
????????SOCK_STEAM:流式套接字?? ?(TCP使用此類型)
????????SOCK_RAW:原始套接字
protocol:
????????默認(rèn)傳0 按照協(xié)議的默認(rèn)屬性創(chuàng)建
返回值:
????????成功返回用來進(jìn)行通信的文件描述符
????????失敗返回-1
IPv4地址形式:
????????struct sockaddr_in {
?? ??? ? ? sa_family_t ? ?sin_family; /* AF_INET */
?? ??? ? ? in_port_t ? ? ?sin_port; ? /* 端口 */
?? ??? ? ? struct in_addr sin_addr; ? /* IP地址 */
?? ? ? };
?? ? ? /* Internet address. */
?? ? ? struct in_addr {
?? ??? ? ? uint32_t ? ? ? s_addr; ? ? /* address in network byte order */
?? ? ? };
端口轉(zhuǎn)換:htons函數(shù)
地址轉(zhuǎn)換:inet_addr函數(shù)
4.2?sendto函數(shù)
?? ? ?ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
? ? ? ? ? ? ? ? ? ? ? const struct sockaddr *dest_addr, socklen_t addrlen);
功能:
????????向一個IP地址和端口發(fā)送數(shù)據(jù)信息
????????端口號:區(qū)分一臺主機(jī)不同的應(yīng)用程序(0 - 65535)
參數(shù):
????????sockfd:套接字文件描述符
????????buf:發(fā)送數(shù)據(jù)空間首地址
????????len:發(fā)送數(shù)據(jù)的長度
????????flags:發(fā)送數(shù)據(jù)屬性(默認(rèn)為0)
????????dest_addr:目的IP地址和端口
????????addrlen:目的IP地址和端口的長度
返回值:
????????成功返回實際發(fā)送字節(jié)數(shù)
????????失敗返回-1?
?4.3 htons函數(shù)
????????主機(jī)轉(zhuǎn)網(wǎng)絡(luò)字節(jié)序
- 主機(jī):小端 ? host
- 網(wǎng)絡(luò):大端 ? network
四種不同的轉(zhuǎn)化函數(shù)
- uint32_t htonl(uint32_t hostlong); ? ? ? ? ?主機(jī)轉(zhuǎn)網(wǎng)絡(luò)
- uint16_t htons(uint16_t hostshort); ? ? ? ? 主機(jī)轉(zhuǎn)網(wǎng)絡(luò)
- uint32_t ntohl(uint32_t netlong); ? ? ? ? ? 網(wǎng)絡(luò)轉(zhuǎn)主機(jī)
- uint16_t ntohs(uint16_t netshort); ? ? ? ? ?網(wǎng)絡(luò)轉(zhuǎn)主機(jī)
????????h:host????????n:net?????????l:long?????????s:short?
4.4?inet_addr函數(shù)
????????in_addr_t inet_addr(const char *cp);
功能:
????????將字符串IP地址轉(zhuǎn)換成二進(jìn)制IP地址形式
????????char *inet_ntoa(struct in_addr in);
功能:
????????將二進(jìn)制ip轉(zhuǎn)換成字符串
4.5?bind
????????int bind(int sockfd, const struct sockaddr *addr,
? ? ? ? ? ? ? ? socklen_t addrlen);
功能:將一個套接字與IP地址和端口號綁定(只能綁定自己的IP地址)
參數(shù):
????????sockfd:套接字文件描述符?
????????addr:IP地址和端口號結(jié)構(gòu)體首地址
????????addrlen:長度
返回值:
????????成功返回0
????????失敗返回-1?
4.6?recvfrom
? ? ? ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
? ? ? ? ? ? ? ? ? ? ? ? struct sockaddr *src_addr, socklen_t *addrlen);
功能:
????????接收網(wǎng)絡(luò)發(fā)送的數(shù)據(jù)信息
參數(shù):
?? ??? ?sockfd:套接字文件描述符
?? ??? ?buf:存放數(shù)據(jù)空間首地址
?? ??? ?len:最大能夠接收的數(shù)據(jù)個數(shù)
?? ??? ?flags:屬性默認(rèn)為0
?? ??? ?src_addr:存放發(fā)送端IP地址信息的空間首地址
?? ??? ?addrlen:想要接收的數(shù)據(jù)長度的空間首地址
返回值:
?? ??? ?成功返回實際接收字節(jié)數(shù)
?? ??? ?失敗返回-1?
具有阻塞功能(直到接收到數(shù)據(jù),才會繼續(xù)向下執(zhí)行)
?5. UDP報文頭
????????UDP首部有8個字節(jié),由4個字段構(gòu)成,每個字段都是兩個字節(jié)
- 源端口: 源主機(jī)的應(yīng)用程序使用的端口號
- 目的端口:目的主機(jī)的應(yīng)用程序使用的端口號?
- 長度:是指UDP頭部和UDP數(shù)據(jù)的字節(jié)長度。因為UDP頭 部長度為8字節(jié),所以該字段的最小值為8
- 差錯檢測,檢測UDP數(shù)據(jù)報在傳輸中是否有錯,有錯則丟棄
?總結(jié)
- 無連接
- 盡最大努力交付(不安全,不可靠(丟包、亂序))
- 面向數(shù)據(jù)報
- 機(jī)制簡單,傳輸效率高
應(yīng)用場景:要求實時性高,但是允許數(shù)據(jù)丟失的場合(直播,VNC)?