UDP優點:
- 可以同時傳送資料給多個對象
- 即時性優於TCP
- 訊息的界限明確
- 比TCP容易超越NAT(P2P情況)
- UDP可以活用STUN(Simple Traversal UDP through NATs)
UDP通訊:
recvfrom() V.S recv()
:主要不同在於,是否每次可以取得傳送端的資料
recvfrom()
#include <sys/types.h>
#incude <sys/socket.h>
ssize_t recvfrom(
int s, /* socket的檔案描述符號 */
void *buf, /* 取得接收資料的緩衝器 */
size_t len, /* buf的大小 */
int flags, /* 指定動作時的動作的旗標 */
struct sockaddr *from, /* 取得關於對象位置資料的sockaddr結構體 */
socklen_t *fromlen /* from的大小 */
);
recv()
#include <sys/types.h>
#incude <sys/socket.h>
ssize_t recvfrom(
int s, /* socket的檔案描述符號 */
void *buf, /* 取得接收資料的緩衝器 */
size_t len, /* buf的大小 */
int flags, /* 指定動作時的動作的旗標 */
);
sendto() V.S send()
主要的差異為,在於send()系統呼叫是要求在socket連線狀態(已是connect()狀態下執行。)
如果是連線狀態下的socket,可以透過write()系統呼叫傳送資料,但send()與write的差別在於是否可以指定flags。
因此,在flags指定為0的send()系統呼叫,變成可和write()一樣的執行動作。
sendto()
#include <sys/types.h>
#incude <sys/socket.h>
ssize_t sendto(
int s, /* socket的檔案描述符號 */
const void *buf, /* 包含傳送資料的緩衝器 */
size_t len, /* buf的大小 */
int flags, /* 指定動作時的動作的旗標 */
const struct sockaddr *to, /* 取得關於對象位置資料的socketaddr結構體 */
socketlen_t tolen /* to的大小 */
);
send()
#include <sys/types.h>
#incude <sys/socket.h>
ssize_t sendto(
int s, /* socket的檔案描述符號 */
const void *buf, /* 包含傳送資料的緩衝器 */
size_t len, /* buf的大小 */
int flags, /* 指定動作時的動作的旗標 */
);