网络编程:热情的UDP

摘要

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. 第 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 阿婆主

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录