网站建设推广 公司,网站开发和软件开发那个简单,郑州企业管理培训课程,上海地产网站建目录 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. 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的区别
主要区别
TCP和UDP的主要区别是TCP具有流控制机制而UDP没有。UDP性能比TCP高在数据量大的情况下TCP的性能会接近UDP的性能但无法超过UDP。 TCP比UDP慢的原因主要如下 1. 收发数据前后进行的连接设置及清除过程 2. 收发数据过程中为保证可靠性而添加的流控制 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函数
#includesys/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函数
#includesys/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套接字注册目标IP和端口号第二阶段传输数据第三阶段删除UDP套接字中注册的目标信息地址 所以未连接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无需执行listenaccept函数可以不执行bind函数。
5.2 客户端通信流程
第一步使用socket函数创建套接字
第二步使用connect函数连接IP地址和端口号可以省略这一步但如果是多次要与同一个主机通信那么增加这一步可以增加性能
第三步使用sendto(或write)发送信息或recvfrom(或recv)接收信息能使用send和recv的前提是已连接UDP套接字
第四步关闭套接字
和TCP不一样UDP可以不执行connect函数连接服务器端。