摘要
UDP,无需联接,自由传输。Linux下的demo,带你掌握UDP网络编程技术。让数据自由飞翔,畅享网络世界。
正文
- 序言
- 5. UDP 网络编程技术
- 5.1 UDP 的原理
- 5.2 UDP 的精确性
- 5.3 完成 UDP 服务器端/手机客户端
- 5.3.1 定义
- 5.3.2 UDP 的数据信息 I/O 涵数
- 5.3.3 UDP 手机客户端详细地址分派
- 5.4 UDP 的传输数据特点
- 5.5 UDP 启用 connect 涵数
- 参照
序言
表明:
- demo 根据 Linux。
5. UDP 网络编程技术
UDP 是无联接的,不用创建联接。
5.1 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协议,就可以随意传送。
如图所示:
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 是数据信息报传送,因此 协议书确保了一次只有接受一个数据信息报。
本人表述:数据信息界限意思是,数据信息是否会全自动切分,例如2个建筑结构持续存有一段运行内存中,那就是有界限的,建筑结构把其切分了。若把其数据信息拷到二维数组里边,那就是无边界的,由于分不清楚从哪里才算是分隔线。
因此 UDP中本端发 N 次到对端,对端就得收 N 次。
5.5 UDP 启用 connect 涵数
UDPtcp协议分:
- 未联接(unconnected)UDP tcp协议。
- 已连接(connect)UDP tcp协议。
掌握下 sendto() 涵数传送数据全过程:
- 第 1 环节:向 UDP tcp协议申请注册总体目标 IP 和端口。
- 第 2 环节:传送数据。
- 第 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 阿婆主
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0