#UDP编程

本文详细介绍了编程中的字节序概念,包括小端和大端格式,以及如何判断系统字节序。重点讲解了UDP协议的介绍、socket编程接口,展示了UDP编程的C/S架构和常用函数。同时涵盖了TFTP、广播、多播等网络通信技术的应用和工作流程。
摘要由CSDN通过智能技术生成

一、编程准备——字节序、地址转化

1.1 字节序概述

        概念:是指多字节数据的存储顺序

        分类:

        小端格式:将低位字节数据存储在低地址

        大端格式:将高位字节数据存储在低地址

注意:

        LSB:低地址

        MSB:高地址

如何判断当前系统的字节序:

1.2 htonl函数

1、网络协议指定了通讯字节序——大端

2、只有在多字节数据处理时候才需要考虑字节序

3、运行在同一台计算机上的进程相互通信时一般不需要考虑字节序。

4、异构计算机之间的通讯,需要转换自己的字节序为网络字节序

在需要字节序转换的时候一般调用特定字节序转换函数

1.2.1 htonl  (host—>network)

1.2.2 htons

1.2.3 ntohl

1.2.4 ntohs

1.3地址转换函数

        人为识别的IP地址是点分十进制的字符串形式,但是计算机或者网络中识别的ip地址是整形数据,所以需要进行转换。

注意:下面这两个函数可用在ipv4和ipv6地址的转换

1.3.1 inet_pton()

1.3.2inet_ntop()

二、UDP介绍、概述

2.1 UDP概述协议,在传输数据前不需要

UDP协议

        面向无连接的用户数据报协议,在传输数据前不需要先建立链接;目的地主机的运输层受到UDP报文后,不需要给出任何确认

UDP特点

        1、相比TCP速度稍快些

        2、简单的请求/应答应用程序可以使用UDP

        3、对于海量传输不应该使用UDP

        4、广播和多播应必须使用UDP

UDP的应用

        DNS(域名解析)、NFS(网络文件系统)、RTP(流媒体)等。

        一般语音和视频通话都是通过UDP实现。

2.2 网络编程接口socket

socket作用:

        提供不同主机的进程间的通信

socket特点:

        1、socket也称为“套接字”

        2、是一种文件描述符,代表了一个通信管道的一个端点

        3、类似对文件的操作一样,可以使用read、write、close等函数对socket套接字进行网络数据的收取和发送操作

        4、得到socket套接字(描述符)的方法调用socket()

socket分类:

        1、socket_STREAM,流式套接字,用于TCP

        2、socket_DGRAM,数据报套接字,用于UDP

        3、socket_RAW,原始套接字,用于链路层

2.3 UDP编程C/S架构

UDP网络编程流程:

服务器:

        创建套接字socket()

        将ip地址、端口号与套接字进行绑定bind()、接收数据recvfrom()、发送数据sendto()

客户端:

        创建套接字socket()、发送数据sendto()、接收数据recvfrom()、关闭套接字close()

2.3 UDP编程--创建套接字

2.3.1 创建socket套接字

2.4 UDP编程-发送、绑定、接收数据

在网络编程中经常使用的结构体,sockaddr_in

 

2.5 两种地址结构使用场合

2.6 sendto发送

2.7 绑定--bind函数

绑定的目的是为了固定服务器的信息(IP地址和端口号)。

UDP网络程序想要收取数据需要什么条件?

        确定的ip地址

        确定的port

怎样完成上面的条件呢?

        接收端 使用bind函数,来完成地址结构与socket套接字的绑定,这样ip、port就固定了

        发送端在sendto函数中指定接收端ip、port,就可以发送数据了。

        由于服务器是被动的,客户端是主动的,所以一般先运行服务器,后运行客户端,所以服务器需要固定自己的信息(ip地址和端口号),这样客户端可以找到服务器并与之通信,但是客户端一般不需要bind绑定,因为系统会自动给客户端分配ip地址和端口号。

2.8 接收数据--recvfrom函数

2.9 UDP编程--client、server

        其实在网络编程开发中client和server双方既可以有发送数据还可以接收数据;一般认为提供服务的一方为server;而接收服务的是client。

3.0 UDP客户端注意点

1、本地IP、本地端口(我是谁)

2、目的IP目的端口(发给谁)

3、在客户端的代码中,我们只设置了目的IP和目的端口

4、客户端的IP和端口号系统会自动分配,不需要指定,如果指定了就需要bind绑定。

3.1 UDP服务器注意点

        1、服务器之所以要bind是因为它的本地port需要是固定的,而不是随机的。

        2、服务器也可以主动地给客户端发送数据

三、UDP编程——TFTP、广播、多播

3.1 TFTP简介、通信过程

3.1.1 TFTP概述

      TFTP:简单的文件传输协议

                最初用于引导 无盘系统,被设计用来传输小文件

    特点:

                基于UDP协议实现

                不进行用户有效性认证

数据传输模式:

                octet:二进制模式

                netascii:文本模式

                mail:已经不在支持

3.1.2 TFTP通信过程

总结:

        1、服务器在69号端口等待客户端的请求

        2、服务器若批准此请求,则使用临时端口与客户端进行通信

        3、每个数据包的编号都有变化(从1开始)

        4、每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的包(数据包ACK)

        5、数据长度以512Byte传输

        6、小于512Byte的数据意味着传输结束

注意:

        以上0代表字符'\0';不同差错码对应不同错误信息。

3.1.3 练习—TFTP客户端

要求:

        使用TFTP协议,下载server上的文件到本地文件

思路:

        1、构建请求报文,送至服务器(69号端口)

        2、等待服务器回应

        3、分析服务器回应

        4、接收数据,知道接收的数据包小于规定数据长度

通过软件设置服务器:服务器的IP地址就是Windows的IP地址

客户端代码:

结果:

4.1 UDP广播

4.1.1 广播的概念

广播:由电台主机向该所在子网内的所有主机发送数据的方式

广播只能用UDP或原始IP实现,不能用TCP

用途:

        单个服务器与多个客户主机通信时减少分组流通

        以下几个协议都用到广播:

                1、地址解析协议(ARP)

                2、动态主机配置协议(DHCP)

                3、网络时间协议(NTP)

特点:

        1、处于同一子网的所有主机都必须处理数据

        2、UDP数据包含会沿协议栈向上一直到UDP层

        3、运行音视频等较高速率工作的应用,会带来大负

        4、局限于局域网内使用

4.1.2 广播的地址

4.1.3 广播与单播的对比

单播:

广播:

 

4.2 广播流程

发送者:

        第一步:创建套接字socket()

        第二步:设置为允许发送广播权限setsockopt()

        第三步:向广播地址发送数据sendto()

接收者:

        第一步:创建套接字socket()

        第二步:将套接字与广播的信息结构体绑定bind()

        第三步:接收数据recvfrom()

                

5.1 UDP多播

5.1.1 概述

多播概述

多播:

        数据的收发仅仅在同意分组中进行,所以多播又成为组播。

多播的特点:

        1、多播地址标示一组接口

        2、多播可以用于广域网使用        

        3、在IPV4中,多播是可选的

5.1.2 多播地址

IPv4 D 类地址是多播地址
十进制: 224.0.0.1
239.255.255.254
十六进制: E0.00.00.01
EF.FF.FF.FE
多播地址向以太网 MAC 地址的映射

5.1.3 多播工作过程

比起多播,多播具有可控性,只有加入多播组的接收者才可以接收数据,否则接收不到。

5.1.4 多播流程

发送者:

        第一步:创建套接字socket()

        第二步:向多拨地址发送数据sendto()

接收者:

        第一步:创建套接字socket()

        第二步:设置为加入多播组setsockopt()

        第三步:将套接字与多播信息结构体绑定bind()

        第四步:接收数据

5.1.5 多播套接口选项

5.1.6 加入多播组演示

sendto:

recvfrom:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值