文档文件目录

前言

说明:

5. UDP 网络编程技术技术性

UDP 是无连接的,无需建立连接。

5.1 UDP 的原理

参考图:
TCPIP-5-UDP网络编程插图

网络服务器B的数据库文件中包含目地网络服务器的IP 端口号。
在这其中IP是把数据信息的目地主机地址,端口号是目地网络服务器对用的程序流程步骤

无线网络路由器器小知识

  • IP:主机地址。如目地IP,每一个有线路由器全是会检查IP,若在本地,就往本地端口映射,若沒有,就往外端口发。(在共享全过程中是不易变的)
  • Mac设备机器设备详细地址。目地MAC,下一个物理学学联接的机械设备详细地址。(在共享整个过程中很有可能会变,因为参考的是下一个,而不是最终目地)

5.2 UDP 的准确性

UDP 无需建立连接和回复校验,应用性比 TCP 高。
一般用在互联网技术及时传送的视频或者音频中,因为丢失一部分数据信息也不会伤害非常大。

5.3 进行 UDP 服务端/手机客户端

5.3.1 界定

UDP 网站服务器和手机客户端均只需一个tcp协议书

  • TCP 中,tcp协议正中间应该是一对一的关系。
  • UDP 中,不论是服务器端或者手机客户端都只务必 1 个tcp协议,就可以随便传送。

如下图所示:
TCPIP-5-UDP网络编程插图1

5.3.2 UDP 的数据信息 I/O 涵数

/*
	sock: 用于传送数据信息的 UDP tcp协议
	buff: 存储待传送数据信息的缓存文件详细地址值
	nbytes: 待传送的数据信息长度,以字节为公司
	flags: 可选项关键主要参数,若没有则传送 0
	to: 存有整体总体目标详细地址的 sockaddr 建筑构造自自变量的详细地址值
	addrlen: 传送给基本参数 to 的详细地址值建筑构造变量长度
	获得成功时返回传送的字节数,失败时返回 -1
*/
#include <sys/socket.h>
ssize_t sendto(int sock, void *buff, size_t nbytes, int flags,
               struct sockaddr *to, socklen_t addrlen);


/*
	sock: 用于传送数据信息的 UDP tcp协议
	buff: 存储待传送数据信息的缓存文件详细地址值
	nbytes: 待传送的数据信息长度,以字节为公司
	flags: 可选项基本参数,若没有则传送 0
	from: 存有消息推送端详细地址信息的 sockaddr 建筑构造变量的详细地址值
	addrlen: 存储基本参数 from 的建筑构造变量长度的变量详细地址值。
	获得成功时返回传送的字节数,失败时返回 -1
*/
#include <sys/socket.h>
ssize_t recvfrom(int sock, void *buff, size_t nbytes, int flags,
                 struct sockaddr *from, socklen_t *addrlen);

5.3.3 UDP 手机客户端详细地址分配

TCP 中手机客户端详细地址可以 设置还能够系统软件软件分配,(TCP connect() 涵数自动式开展分配IP&端口号),建立连接后就固定不变运用。

UDP 中手机客户端中开启 sendto() 涵数时自动式分配 IP 和 端口号,第一次开启才分配,分配后运用直至操作程序结束(有个人爱好可以 看一下UDP打洞专业性)。
还能够在开启 sendto() 涵数前运用 bind() 涵数关系该机器设备 IP。

5.4 UDP 的传送数据特性

TCP 是流式的的的传送数据,信息内容没有界线,务必传输层本身去定义信息内容界线。
UDP 是数据信息报传送,因而 合同书保证了一次仅有接纳一个数据信息报。
自己描述:数据信息界线意思是,数据信息是不是会自动式分割,比如两个建筑构造不断存在一段运作运行内存中,那便是有边界的,建筑构造把其分割了。若把其数据信息拷贝到二维数组里面,那便是无边界的,因为搞不清从哪里才算得上分割线

因而 UDP中本端发 N 次到对端,对端就得收 N 次。

5.5 UDP 开启 connect 涵数

UDPtcp协议分

  • 未连接(unconnected)UDP tcp协议。
  • 已连接(connect)UDP tcp协议。

把握下 sendto() 涵数传送数据信息整个过程

  1. 第 1 阶段:向 UDP tcp协议申请办理申请注册目标 IP 和端口号。
  2. 第 2 阶段:传送数据信息。
  3. 第 3 阶段:删除 UDP tcp协议中申请办理注册账号的目标详细地址信息。

事实上务必常常消息推送,那第一阶段和第三阶段是不断多余的,因而 可以 运用 已连接(connect)UDP tcp协议。

创建已连接 UDP tcp协议

  • 注意:这里的已连接并并没有与对端建立连接,仅仅关系目标端口到 UDP socket 中,后面开启 sendto() 就不用推行①、③步了。
sock = socket(PF_INET, SOCK_DGRAM, 0);
memset(&adr, 0, sizeof(adr));
adr.sin_family = AF_INET;
adr.sin_addr.s_addr = inet_addr(argv[1]);
adr.sin_port = htons(atoi(argv[2]));
connect(sock, (struct sockaddr *)&adr, sizeof(adr));

小知识

  • UDP 是可以 运用 bind() 涵数的,主要是配置本地IP和端口号。若不宜,则由系统软件软件随意分配。
  • UDP 是可以 运用 connect() 涵数的,主要是配置远侧IP和端口号。若不运用,则每一次开启 sendto() 涵数时都必须设置、删除远侧IP和端口号,用时。

参考

  • 《TCP/IP网络编程》
  • 李柱明blog-TCP/IP TCP详细笔记
  • Github 阿婆主