udp的通信流程和接口函数
=====================================
1.通信流程
udp没有客户端和服务器的概念
udp有发送端和接收端的概念
udp发送端:谁先发送信息,谁就是发送端
发送端
socket--》bind--》收发信息--》关闭
接收端
socket--》bind--》收发信息--》关闭
2.收发信息
//发送信息
ssize_t sendto(int socket,void *message, size_t length,int flags,struct sockaddr *dest_addr,socklen_t dest_len);
返回值:成功 --》返回发送的字节数
失败 --》-1
参数:socket --》你创建的udp套接字
前面4个参数跟send一模一样
dest_addr --》存放对方(你要发送信息过去,需要接收你信息的那个主机)的ip和端口号
dest_len --》地址结构体的长度
//接收信息
ssize_t recvfrom(int socket,void *buffer,size_t length,int flags, struct sockaddr *address,socklen_t *address_len);
返回值:成功 --》返回接收的字节数
失败 --》-1
注意:recv和recvfrom是不同的
第一:recv用于tcp,recvfrom用于udp
第二:recv返回0表示对方断开了,并且recv也不再阻塞
recvfrom如果对方退出了,recvfrom照样阻塞,不会返回0
参数:前面4个参数跟recv一模一样
address --》存放对方的ip和端口号
注意:address参数不需要初始化,当某个主机利用udp发送信息过来,recvfrom接收的时候会自动把发送端主机的ip和端口号填充到这个变量中
address_len --》地址长度大小,要求是指针
udp广播代码实现
=====================================
1.ip地址的分类 A B C D四类地址
网络号(网段):用来区分不同的局域网
比如:粤嵌有很多课室,每个课室都是一个小型的局域网,每个局域网的网段(网络号)都是不同的
咱们课室192.168.22 --》广播专用地址192.168.22.255
隔壁课室192.168.23 --》广播专用地址192.168.23.255
隔壁课室192.168.24
隔壁课室192.168.25
主机号:用来区分同一个局域网内部,不同的主机
咱们课室192.168.22 主机一 192.168.22.30
主机二 192.168.22.31
10.0.9.5 --》A类
192.168.22.2 --》C类
udp组播:发送给局域网中同一个组播组里面的主机
udp广播:发送给局域网中的所有主机
2.udp广播代码思路及实现
广播发送端
创建套接字socket
绑定bind
设置套接字的属性为可以广播setsockopt
发送广播信息sendto( 使用局域网中的广播专用地址)
广播接收端
创建套接字socket
绑定bind
接收广播信息recvfrom
设置套接字的属性为可以广播
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
udp组播代码实现(组播是广播的一种特殊形式)
=====================================
组播发送端
创建套接字socket
绑定bind
设置套接字的属性为可以广播setsockopt
发送组播信息sendto( 使用组播专用地址(D类地址))
组播接收端
创建套接字socket
绑定bind
加入到某个组播组里面
接收组播信息recvfrom
注意:加入到组播组代码如下
struct ip_mreq mreq; //定义结构体变量保存组播组信息
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr("跟发送端使用的组播地址一致"); // D类地址
mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 必须用这个宏定义
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq)); //把这个主机添加到组播组里面
对比tcp和udp(理论知识,面试的时候很喜欢问)
=====================================
1.tcp和udp的不同
第一个:tcp是面向连接的,可靠的通信方式
udp是无连接,不可靠的通信方式
面向连接(三次握手):tcp通信过程中客户端需要主动调用connect函数去连接服务器
tcp服务器需要主动调用accept去接受客户端的连接请求,它们才能通信
udp在通信的时候,是没有这个过程
可靠:tcp协议的底层支持错误重传(会校验数据),不容易丢失数据包(网络拥堵的情况下)
不可靠:udp不支持错误重传,网络拥堵的时候很容易丢失数据包
2.tcp和udp的适用场合
tcp适合通信要求高的场合,比如:传输账号和密码,传输重要文件
udp适合通信要求不高的场合,比如:udp用于视频点播
3.三次握手和四次握手
三次握手:发生在tcp客户端调用connect去连接服务器的时候
四次握手:发生在tcp客户端跟服务器断开连接的时候