网络编程传输层——UDP通信

2023-05-16

何为传输层?

        在物理层、数据链路层、网络层解决了主机和主机之间能够发送接收数据,但是在计算机网络中,主机的通信主体还是进程,而传输层则解决应用进程的通信,所谓传输层协议也是端对端协议

传输层的协议主要有两种:TCP协议UDP协议

本章这次主要是针对的UDP协议,下一章才是针对TCP协议的具体理解。

        在传输层需要了解到一个新的概念:端口号port(可以理解为你要从那个地方传进去),设计了一个端口号来标识主机中的进行网络通信的进程。

        port:16bit整形(两个字节)       

        端口号只在本机上有作用,在不同主句中同一个程序执行,也可以用不同的端口号。

什么是UDP协议?

        UDP协议(用户数据报协议)(非面向连接)

        1. 无连接,不需要提前把两个程序关联起来(想发给谁就发给谁)。

        2. 面向报文的传输,应用程序要发送的数据,直接封装在udp数据报中(直接放在udp协议内容 后),既不做拆分也不做合并,直接交给网络层。

        3. 不可靠,不保证数据一定能到达,尽最大努力交付。

         UDP协议就是在MAC帧的外面在加上一层传输协议,既加上UDP头部,它的头部由以下四部分组成。

源端口:自己主机的端口号

目标端口:要传到那个主机的端口号

下面这张图是一个传输模型

 

        可以看出这是TCP/IP网络模型,因为只有四层,从用户层、传输层、网络层、网络接口层构成。

        在操作系统当中,其实网络协议是有写好了的函数库可以使用,只需要选择对应的协议就行。

如何进行UDP协议进行通信?

1、首先我们需要了解udp怎样进行通信的,下图是udp通信流程

 清楚了流程,但肯定不懂得后面函数得意义吧,下面来进行函数的细讲:

1、创建套接字(这里就是相当于创建一个包含网络通信协议的套接字文件

#include <sys/types.h>
#include <sys/socket.h>

int socket(int somain, int type, int protocol);

参数1:选择那种ip地址进行通信-----网络层    AF_INET  IPV4
参数2:选择那种传输-----传输层    SOCK_STREAM  TCP    SOCK_DGRAM  UDP  SOCK_RAM 不使用
参数3:套接字协议    0  默认

返回值    成功:返回套接字    失败:返回-1

2、绑定套接字(也就是将自己的本地网络信息绑定到网络协议中)

#include <sys/types.h> /* See NOTES */ 
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

参数1;利用函数int socket函数创建的套接字
参数2:自己的IPV4网络信息
    struct sockaddr_in 
      { 
            sa_family_t sin_family; 地址族:AF_INET/*address family: AF_INET */         
            in_port_t sin_port;port端口号:当前进程的端口号 
            struct in_addr sin_addr;ip地址:本地网络地址 /* internet address */ 
      };

            struct in_addr 
              { 
                uint32_t s_addr;32位整数,ip地址 /* address in network byte order */ 
              };
参数3:结构体大小,直接sizeof(struct addr)

3、这个函数就是发送数据与接收数据(发给谁,接收谁)

UDP发送数据

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

参数1:要通过套接字发送给谁
参数2:要发送数据的首地址
参数3:发送数据的大小
参数4:标志    0:阻塞等待,发送完成才结束
参数5:const struct sockaddr *dest_addr:结构体地址,要包含目标,接收方的地址、端口
参数6::结构体大小,目标网络信息结构体的大小

返回值    成功:返回发送的字节数    失败:返回-1

UDP接收数据

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

参数1:int sockfd:套接字,本地套接字携带了本地的网络信息,进行匹配 
参数2:void *buf:接收了数据存储的地址 
参数3:size_t len:最大接收多少个字节 
参数4:int flags:标志 0:阻塞接收,函数一直等待接收了数据,完成接收才结束 
参数5:struct sockaddr *src_addr:结构体地址,把发送方的ip、port存储到这个结构 体,得到发送方的信息 如果不需要 填NULL 
参数6:socklen_t *addrlen:把结构体大小也存储到这个地址,得到发送方对应的信息大小 如果不需要 填NULL 

返回值:    成功:返回接收到的字节数     失败:返回-1

        在计算机存储数据中,有大小端之分(大端(高存低地址,低存高地址)小端(高存高地址,低存低地址)),但是在网络上传输时,统一成了大端模式。

        在网络上传输的方式是网络字节序 ,而在机器上存储的方式是主机字节序。

        则我们需要在传输时将主机字节序转网络字节序 ,网络字节序转主机字节序。

实例:

        发送端程序:

        

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>

//当前进程发送数据到指定主机的指定进程中,然后接收对方的数据
int main()
{

	//1、创建套接字------在进程中要使用网络通信协议,得到套接字文件描述符
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);    //IPV4,UDP协议

	//2、绑定套接字,绑定套接字 中 协议中本地的网络信息
	//把套接字,绑定本地网络信息
	struct sockaddr_in srcaddr;//本地网络信息---源信息
	srcaddr.sin_family = AF_INET;//ipv4 地址
	srcaddr.sin_port = htons(9999);//当前进程的端口号
	srcaddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");//把主机地址转为32位整数

	bind(sockfd,(struct sockaddr *)&srcaddr,sizeof(struct sockaddr_in));

	//3、发送数据

	//目标结构体
	struct sockaddr_in destaddr;//目标信息
	destaddr.sin_family = AF_INET;
	destaddr.sin_port = htons(8888);
	destaddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");

	while(1)
	{
		char buf[20],buf2[20];
		scanf("%s",buf);//输入了数据
		sendto(sockfd,buf,20,0,(struct sockaddr *)&destaddr,sizeof(destaddr));发送
		
		recvfrom(sockfd,buf2,20,0,NULL,NULL);接收
		printf("%s\n",buf2);
	}

	close(sockfd);
}

        接收数据程序、

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>

//当前进程接收数据,然后发送给对方
int main()
{

	//1、创建套接字------在进程中要使用网络通信协议,得到套接字文件描述符
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);

	//2、绑定套接字,绑定套接字 中 协议中本地的网络信息
	//把套接字,绑定本地网络信息
	struct sockaddr_in srcaddr;//本地网络信息---源信息
	srcaddr.sin_family = AF_INET;//ipv4 地址
	srcaddr.sin_port = htons(8888);//当前进程的端口号
	srcaddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");//把主机地址转为32位整数

	bind(sockfd,(struct sockaddr *)&srcaddr,sizeof(struct sockaddr_in));

	//3、接收数据

	//目标结构体
	struct sockaddr_in destaddr;//目标信息
	destaddr.sin_family = AF_INET;
	destaddr.sin_port = htons(9999);
	destaddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");

	char buf2[20];
	while(1)
	{
		recvfrom(sockfd,buf2,20,0,NULL,NULL);    //接收
		printf("%s\n",buf2);
		
		sendto(sockfd,buf2,20,0,(struct sockaddr *)&destaddr,sizeof(destaddr));    //发送获取
		
	}

	close(sockfd);
}

        UDP协议采用的非面向连接(没有连接),所以还是有很多问题的,无连接、不可靠、面向数据报的传输 。而且发送了也不知道发送到了没,缺点之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程传输层——UDP通信 的相关文章

  • 北斗短报文介绍

    1 什么是北斗短报文通信 xff1f 北斗系统的短报文通信 xff0c 是指北斗地面终端和北斗卫星 北斗地面监控总站之间能够直接通过卫星信号进行双向的信息传递 xff0c 通信以短报文 xff08 类似手机短信 xff09 为传输基本单位
  • 什么是星基增强系统SBAS

    SBAS xff1a 英文全称Satellite Based Augmentation System xff0c 中文意思是广域差分增强系统 xff0c 如果不知道这是什么意思 xff0c 那么说星基增强系统相信大家都知道 广域差分增强系统
  • GNSS PPP和PPK区别

    01 PPP PPP全称Precise Point Positioning xff0c 译为精密单点定位 xff0c 属于单点定位也叫绝对定位 xff0c 精密单点定位是指利用载波相位观测值以及由IGS等组织提供的高精度的卫星星历及卫星钟差
  • 三轴加速度计计算俯仰角、横滚角、偏航角

    pitch是俯仰角 xff0c 是 点头 xff0c xff08 在固定翼飞机中则由升降舵舵机控制 xff09 yaw是偏航角 xff0c 是 摇头 xff0c xff08 在固定翼飞机中则由方向舵舵机控制 xff09 roll是旋转角 x
  • 如何使用UBLOX ZED-F9P +4G获取千寻差分,实现厘米级定位同时回传到IP服务器

    格林恩德F9P 4G RTK模块 xff0c 集成高精度板卡ZED F9P以及4G模组 xff0c 可同时接收GPS xff0c 北斗 xff0c GALILEO GLONASS卫星系统的L1 L2频点 xff0c 结合高精度天线一体化设计
  • 小型RTK/LITE RTK/Mini RTK CR202(9P+4G+imu) 惯导 实现高精度厘米级定位,输出组合导航位置,定位数据回传服务器

    格林恩德 CR202 是一款小巧 迷你的RTK设备 xff0c 集成高精度板卡 ZED F9P 与4G EC20通信模组 xff0c 内置惯性导航IMU三轴加速度计 三轴陀螺仪 CAN收发器 xff0c 支持多种差分链路包括4G 电台 支持
  • 常用CORS账号设置方法(千寻CORS、中国移动CORS、六分CORS、北斗CORS、迅腾CORS)

    1 千寻CORS账号设置方法 2 中国移动CORS账号设置方法 3 六分CORS账号设置方法 4 北斗CORS账号设置方法 5 讯腾CORS账号设置方法 格林恩德专注GPS北斗高精度定位 北斗短报文通信与无线传输应用产品的开发与市场拓展
  • NTRIPClient_1.7 工具使用方法分享

    1 打开NTRIPClient 1 7软件 2 选择串口和波特率 xff0c 正确的与板卡或者模块连接 点击编辑 xff0c 进入串口配置界面 选择正确的端口和波特率 3 输入正确的差分账号 输入千寻差分账号地址 端口 用户名 账号密码 4
  • 导航卫星的时间系统

    1 GPS时间系统 xff08 GPST xff09 GPS系统是测时测距系统 时间在 GPS测量中是一个基本的观测量 卫星的信号 xff0c 卫星的运动 xff0c 卫星的坐标都与时间密切相关 对时间的要求既要稳定又要连续 为此 xff0
  • JT808协议介绍 --- 格林恩德 CR202 RTK 高精度车载定位器协议解读

    部标808又称为JT808 xff0c JT808标准的全称是 道路运输车辆卫星定位系统终端通讯协议及数据格式 808协议适用于GPS定位车载终端和监控平台之间的通信 当前市面上 xff0c 普通车辆监测设备所安装的GPS定位器 xff0c
  • C++析构函数调用顺序

    文章目录 析构函数工作过程 1 执行析构函数的函数体 2 如果该类中拥有类对象成员 xff0c 且类对象有析构函数 xff0c 则以类对象成员声明次序的相反顺序调用其析构函数 xff0c 销毁类对象成员 3 按原来构造顺序的相反顶序向上依次
  • TCP通信C++实现小例子

    TCP通信C 43 43 实现案例 https www bilibili com video BV1Dt411p74c t 61 1746 61 61 全部来自以上视频 xff0c 纯属搬运 xff0c 小可爱有问题可以举手提问哈 61 6
  • 串行通信简介

    一 串行通信与并行通信 计算机与外界的数据交换称为通信 xff0c 通信分为并行通信和串行通信两种基本方式 并行通信 串行通信 并行通信 xff1a 并行通信指各个数据位同时进行传送的数据通信方式 xff0c 因此有多少个数据位 xff0c
  • 使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

    板子 xff1a 普中科技stm32F1 芯片stm32f1103zet6 1 程序如下 xff1a include 34 stm32f10x h 34 导入头文件 typedef unsigned int u32 typedef是系统关键
  • day 5 select服务器和客户端

    select客户端代码 xff1a include lt stdio h gt include lt string h gt include lt sys socket h gt include lt netinet in h gt inc
  • python Requests添加Auth和Cert

    最近通过postman发起另外一个项目的请求 xff0c 鉴权较为复杂 xff0c 首先需要设置cert xff0c postman中设置如下 xff1a 需要设置basic auth的参数 然后将接口返回的token放入auth的bear
  • STM32笔记(三)---寄存器映射--BSRR分析

    STM32笔记 xff08 三 xff09 寄存器映射 BSRR分析 GPIO与引脚区别 GPIO包含在引脚内 xff08 引脚内还有电源 晶振等特殊功能引脚 xff09 xff0c 除GPIO拓展内容即为单片机最小系统 GPIO功能如何检
  • ROS赵虚左6.5 Rviz中控制机器人模型运动_选了odom坐标系后小车变白不能动

    原因 xff1a 配置文件中的参考坐标不应该是base footprint xff0c 而是你自己小车最下面那个 小脚 的坐标系 xff0c 我的是footprint 所以把参考坐标换一下就可以了
  • 超声波传感器的基础

    超声波传感器已经有几十年的历史了 xff0c 但是由于它们的性能 灵活性和低成本 xff0c 它们仍然占据着传感市场的很大一部分 随着越来越多的产品实现了自动化 xff0c 随着机器人 自动驾驶汽车和无人驾驶飞机的出现 xff0c 需求进一
  • pthread_create未定义的引用

    在ubuntu使用gcc编译时出现 pthread create未定义的引用 问题 解决如下 xff1a 在编译时加入 l pthread 例如gcc thread c o thr l pthread 原因 xff1a pthread不是l

随机推荐

  • Linux下vscode实现调试

    1 安装好vscode xff0c 安装对应的插件 2 编写代码 xff0c 点击右上角的三角形 xff0c 生成对应可执行文件 3 点击菜单栏中的终端 配置任务 xff0c 选择 c c 43 43 xff1a GCC build act
  • 二进制数与十进制之间的转换以及使用一个函数实现任意进制之间的转换

    其他进制转为十进制都可以实现 xff0c 只需要将函数中的10和2换掉你需要的就行 include lt stdio h gt include lt math h gt 1 二进制转换为十进制 int twoConvertTen long
  • vscode配置C语言编译调试的方法

    一 安装GCC 官方下载 如果你能从在线安装 xff0c 那最好就在线安装吧 不过在线安装太容易中断失败了 如果你能连上官网 xff0c 也可以选择从官网去下载离线安装包 https sourceforge net projects min
  • C语言之补漏(1)

    typedef 1 define与typedef区别 xff1f 相比起宏定义的直接替换 xff0c typedef是对类型的封装 xff08 通俗说就是对类型起一个别名 xff09 2 typedef可以给多个别名 typedef int
  • 关于学习如何组装基于F4V3S飞控的竞速穿越机

    广西 河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 创作时间2020 8 22 组装一架穿越机 xff0c 你需要的一些最基本的 xff0c 能让它飞起来的配件有 xff1a 机架
  • STM32—串口

    串口介绍 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指数据一位一位
  • 2021电赛元件清单(评论区有题目预测)

    2021 年全国大学生电子设计竞赛仪器设备和主要元器件及器材清单 本科组 1 仪器设备清单 数字示波器 xff08 100MHz xff0c 双通道 xff09 函数发生器 xff08 50 MHz xff0c 双通道 xff09 任意波信
  • 通过TCP实现客户端与服务端之间通信

    客户端发送的消息 xff0c 服务端接收并在终端中显示出来 服务端代码 xff08 server c include lt stdio h gt include lt sys socket h gt include lt netinet i
  • Qt导入Opencv出现undefined reference to cv::xxx

    Qt配置Opencv在Qt运行时报错undefined reference to cv xxx Face Recognizer报错 FaceRecognizer load const char 41 报错 首先 xff0c 如果出现cv x
  • ESP32 之 ESP-IDF 教学(十二)WiFi篇—— LwIP 之 TCP 通信

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF xff0c 讲解如何使用 ESP IDF 构建 ESP32 程序 xff0c 发布文章并会持续为已发布文章添加新内容 xff01 每篇文章都经过了精打细磨 xff01 通过下方对
  • ACWING 799. 最长连续不重复子序列 (入门) (双指针算法)

    给定一个长度为 n 的整数序列 xff0c 请找出最长的不包含重复的数的连续区间 xff0c 输出它的长度 输入格式 第一行包含整数 n 第二行包含 n 个整数 xff08 均在 0 105 范围内 xff09 xff0c 表示整数序列 输
  • STM32串口通信晶振导致问题出现

    STM32串口通信问题 关于stm32串口通信的问题 xff0c 比较常见的主要是以下几个问题 xff1a 1 xff0c 因为波特率不同导致通信时出现乱码 xff0c 这是一个比较常见的问题 xff0c 也是比较容易发现和解决的问题 2
  • 解决ERROR: cannot launch node of type [move_base/move_base]

    最近拿了别人的程序跑 xff0c 直接将工作空间git了过来 xff0c 结果发现提示错误 xff1a ERROR cannot launch node of type move base move base Cannot locate n
  • 基于单片机控制的开关电源设计

    文末下载完整资料 1 概述 1 1 课题来源及意义 电源技术是一种应用功率半导体器件 xff0c 综合电力变换技术 现代电子技术 自动控制技术的多学科的边缘交叉技术 随着科学技术的发展 xff0c 电源技术又与现代控制理论 材料科学 电机工
  • Hikvison对接iSecure Center时获取Appkey和Secert、不显示API网关、预览时提示网络请求失败

    场景 SpringBoot 43 Vue 43 iSecure Center xff08 海康综合安防管理平台 xff09 实现视频预览 xff1a SpringBoot 43 Vue 43 iSecure Center xff08 海康综
  • request和response

    文章目录 前言一 request功能1 获取请求行数据 xff08 1 xff09 方法 xff08 2 xff09 获取请求头数据 xff08 3 xff09 获取请求体数据 2 其他功能 xff08 1 xff09 获取请求参数通用方式
  • C++ Primer Plus 学习笔记(一)

    目录 第二章 开始学习C 43 43 1 主函数 2 预处理器 3 endl 第三章 处理数据 1 简单变量 2 整型 3 C 43 43 初始化 xff1a 4 字符 5 bool 6 const限定符 7 浮点数 8 算数运算符 9 类
  • 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信

    文章目录 前言一 ESP8266模块与STM32连接二 单片机代码三 总结 前言 承接上文WIFI上位机部分 xff1a 上位机 通过WIFI上位机与网络调试助手通信绘制曲线 xff0c 现阶段实现了STM32单片机与ESP8266WIFI
  • Linux C++服务器项目——项目实战1(理论知识)

    牛客 C 43 43 高并发服务器开发 参考笔记 1 阻塞 非阻塞 同步 异步 网络lO 2 Unix Linux上的五种lO模型a 阻塞blockingb 非阻塞non blocking NIO c IO复用 IO multiplexin
  • 网络编程传输层——UDP通信

    何为传输层 xff1f 在物理层 数据链路层 网络层解决了主机和主机之间能够发送接收数据 xff0c 但是在计算机网络中 xff0c 主机的通信主体还是进程 xff0c 而传输层则解决应用进程的通信 xff0c 所谓传输层协议也是端对端协议