UDP使用讲解

UDP网络编程

内容

一、概述

二、基本UDP编程

三、UDP广播

Udp编程主要用到的函数 socket() bind() sendto() recvfrom() close()

一、概述

1. UDP协议

UDP是面向无连接的用户数据报协议,在传输数前不需要先建立连接。

目地主机的运输层收到UDP报文后,不需要给出任何确认

2. UDP协议与TCP协议的差异

   

 

TCP

UDP

是否面向连接

是否可靠

是否广播

效率

3.如何在TCP和UDP之间取舍

1)广播和多播应用必须使用UDP

2)简单的请求-应答应用程序可以使用UDP

3)对于海量数据传输不应该使用UDP

4.UDP的使用场合

DNS、NFS、流媒体传输等等

二、基本UDP编程

客户端服务端通信例子

UDP使用讲解_第1张图片

1.ssize_t  recvfrom(int sockfd, void*buf,size_t nbytes,int flags,

struct sockaddr* from, socklen_t  *addrlen);

功能:

用于接收数据

参数:

sockfd:套接字

buf: 接收数据缓冲区

nbytes:接收数据缓冲区的大小

flags: 套接字标志(常为0)

from: 用于存放发送方信息的地址结构体指针

addrlen: from所指内容的长度

注意:

struct sockaddr *from, socklen_t *addrlen

类似于accept函数的最后两个参数

通过from和addrlen参数存放数据来源

可以为NULL, 表示不关心数据来源

返回值:

成功:接收到的字符数

失败: -1

2.ssize_t  sendto(int sockfd,const void* buf, size_t nbytes,int flags,

const struct sockaddr *to,socklen_t addrlen);

功能:

用于发送数据

参数:

sockfd:套接字

buf:发送数据缓冲区

nbytes:发送数据缓冲区的大小

flags:一般为0

to:指向目的主机地址结构体的指针

addrlen:to所指向内容的长度

注意:

const struct sockaddr *to,socklen_t addrlen

类似于connect函数的最后两个参数

通过to和addrlen确定目的地址

发送一个0长度的UDP数据包是可行的

返回值:

成功:发送的字符数

失败: -1

三、UDP广播

1. UDP广播概述

1) 广播:由一台主机向该主机所在子网内的所有主机发送数据的方式

2) 广播只能用UDP或原始IP实现,不能用TCP

3) 广播的用途

单个服务器与多个客户主机通信时减少分组流通

址解析协议(ARP)

动态主机配置协议(DHCP)

网络时间协议(NTP)

2. 广播地址

1) {子网ID,主机ID}

子网ID表示由子网掩码中1覆盖的连续位

主机ID表示由子网掩码中0覆盖的连续位

2) 子网定向广播地址:主机ID全1

例如:对于192.168.220.0/24子网,192.168.220.255即为其定向广播地址

通常路由器不转发该广播

3) 受限广播地址:255.255.255.255

路由器从不转发该广播

通常在DHCP等应用中把该地址当做宿主地址,因为此时客户主机还不知道所处子网的信息

3. UDP广播的特点

处于同一子网的所有主机都必须处理数据

UDP数据包会沿协议栈向上一直到UDP层

运行音视频等较高速率工作的应用,会带来大负

局限于局域网内使用

3. UDP广播的特点

处于同一子网的所有主机都必须处理数据

UDP数据包会沿协议栈向上一直到UDP层

运行音视频等较高速率工作的应用,会带来大负荷

局限于局域网内使用

4. 套接口选项

int setsockopt(int sockfd, int level,int optname,const void *optval, socklen_t optlen);

成功执行返回0,否则返回-1

广播例子:

 

#include
#include
#include
#include
#include
#include
#include
#include

int main( int argc, char* argv[])
{
int sockfd = 0;
char buf[ 1024] = "";
unsigned short port = 8000;
struct sockaddr_in send_addr;

bzero(&send_addr, sizeof(send_addr));
send_addr. sin_family = AF_INET;
send_addr. sin_port = htons(port);

sockfd = socket(AF_INET,SOCK_DGRAM, 0);
if(sockfd < 0){
perror( "socket error");
exit(EXIT_FAILURE);
}

if(argc > 1){
send_addr. sin_addr. s_addr = inet_addr(argv[ 1]);
} else{
printf( "not have a server IP \n ");
exit(EXIT_FAILURE);
}

int yes = 1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&yes, sizeof(yes));

strcpy(buf, "broadcast success");

int len = sendto(sockfd,buf, strlen(buf), 0, \
( struct sock_addr*)&send_addr, sizeof(send_addr));
if(len < 0){
printf( "send error \n ");
close(sockfd);
exit(EXIT_FAILURE);
}

return 0;
}

你可能感兴趣的:(Linux)