15、UDP 数据收发实战
① 再论UDP协议
- UDP是无连接的(不可靠的,无应答消息,数据包无序号标识)
- UDP是面向数据包的,对应用层数据既不合并也不拆分(保留数据包边界,不粘包)
- UDP没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低
- UDP支持一对一、一对多、多对一和多对多的交互通信
- UDP消息头开销小,只有8个字节(TCP消息头共20个字节)
- UDP相比较TCP更高效,牺牲效率
② UDP和IP的区别
- UDP是建立于IP之上的数据传输协议
- IP负责将UDP数据包从源主机传输到目标主机
- UDP则将应用层数据投递到目标socket(端口号)(socket和端口号通过bind函数绑定)
- UDP几乎完整“继承”了IP传输的特性(不能缺少传输层,UDP应运而生)
- 通信两端无交互,无流控,无超时重发,不具备可靠性
- ····应用层(应用数据) ==> 传输层(TCP(深度定制)、UDP(轻度定制)) ==> IP层(IP)
③ UDP数据收发
④ UDP编程模式
⑤ UDP数据收发
⑥ 编程实验:UDP数据收发
client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int sock = 0;
struct sockaddr_in addr = {0};
struct sockaddr_in remote = {0};
int len = 0;
char buf[128] = {0};
char input[32] = {0};
int r = 0;
sock = socket(PF_INET, SOCK_DGRAM, 0);
if( sock == -1 )
{
printf("socket error\n");
return -1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(9999);
if( bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1 )
{
printf("udp bind error\n");