当前位置: 代码网 > it编程>编程语言>C/C++ > [C++ 网络协议编程] UDP协议

[C++ 网络协议编程] UDP协议

2024年08月03日 C/C++ 我要评论
UDP协议的基本介绍

目录

1. udp和tcp的区别

2. udp的工作原理

3. udp存在数据边界

4. udp的i/o函数

4.1 sendto函数

4.2 recvfrom函数

4. 已连接(connected)udp套接字和未连接(unconnected)udp套接字

5. udp的通信流程

5.1 服务器端通信流程

5.2 客户端通信流程


1. udp和tcp的区别

主要区别:

  1. tcp和udp的主要区别是,tcp具有流控制机制,而udp没有。
  2. udp性能比tcp高,在数据量大的情况下,tcp的性能会接近udp的性能,但无法超过udp。

     3. udp不如tcp可靠,有可能会发生数据的丢失。

2. udp的工作原理

如图,ip的作用是让数据准确传到主机a,而udp的最重要的作用就是把数据准确的传到主机a的指定套接字上

3. udp存在数据边界

为什么说udp存在数据边界?

因为:

        1.与tcp不同,udp的通信过程中,i/o函数的调用次数必须保持一致,即客户端sendto了几次,服务器端也要recvfrom几次。

        2.同时也因为udp每次传输的数据包又称为udp数据报,数据报也是数据包的一种,不同的是,udp数据报本身可以成为1个完整的数据,而tcp的一个完整的数据可以由多个数据包组成。

4. udp的i/o函数

4.1 sendto函数

#include<sys/socket.h>
ssize_t sendto(
int sock,                     //用于传输数据的udp套接字文件描述符
void *buff,                   //保存待传输数据的缓冲地址值
size_t nbytes,                //待传输的数据长度,以字节为单位
int flags,                    //可选项参数,没有就设置为0
struct sockaddr* to,          //存有目标地址信息的sockaddr结构体变量的地址值
socklen_t addrlen             //传递给参数to的地址值结构体变量长度
);
成功返回传输的字节数,失败返回-1

udp的套接字不会保持连接状态,因此每次传输数据都要添加目标地址信息。

4.2 recvfrom函数

#include<sys/socket.h>
ssize_t recvfrom(
int sock,                //用于接收数据的udp套接字文件描述符
void* buff,              //保存接收数据的缓冲地址值
size_t nbytes,           //可接受的最大字节数,无法超过buff的大小
int flags,               //可选项参数,没有则传0
struct sockaddr* from,   //存有发送端地址信息的sockaddr结构体变量的地址值
socklen_t *addrlen       //保存参数from的结构体变量长度的地址值
);

4. 已连接(connected)udp套接字和未连接(unconnected)udp套接字

已连接udp套接字:执行了connect函数或bind函数,套接字绑定了某主机ip和端口号

未连接udp套接字:未执行connect函数或bind函数,套接字在每次执行sendto函数时,再绑定某主机ip和端口号。

udp中通过sendto函数传输数据可分为三个阶段:

所以,未连接udp套接字,可以重复利用同一个udp套接字,向不同主机传输数据。但如果你每次都是向同一个主机传输多次,那么上述阶段会重复多次,这样会大大的消耗程序性能,因为sendto函数的第一阶段和第三阶段占整个通信过程的1/3,所以,这种情况下,你可以使用已连接套接字,在sendto函数前就先调用connect函数或bind函数,绑定ip和端口号,这样sendto函数就会节省第一阶段和第二阶段的时间,提高程序效率。

5. udp的通信流程

5.1 服务器端通信流程

第一步:使用socket函数创建套接字

第二步:使用bind函数绑定ip地址和端口号(可以省略这一步,但如果是多次要与同一个主机通信,那么增加这一步可以增加性能

第三步:使用sendto(或write)发送信息或recvfrom(或recv)接收信息(能使用send和recv的前提是已连接udp套接字

第四步:关闭套接字

和tcp不一样,udp无需执行listen,accept函数,可以不执行bind函数

5.2 客户端通信流程

第一步:使用socket函数创建套接字

第二步:使用connect函数连接ip地址和端口号(可以省略这一步,但如果是多次要与同一个主机通信,那么增加这一步可以增加性能

第三步:使用sendto(或write)发送信息或recvfrom(或recv)接收信息(能使用send和recv的前提是已连接udp套接字

第四步:关闭套接字

和tcp不一样,udp可以不执行connect函数,连接服务器端。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com