【网络】1.UDP通信

UDP通信

  • 1 server
    • 1.1 server建立的步骤
    • 1.2 运行server
  • 2 client
    • 2.1 client的建立步骤
    • 2.2 运行client
  • 3 总结
    • 3.1 server
    • 3.2 client

1 server

server的启动方式是:./udpserver 8080 --> 格式就是./proc port端口

port端口自己指定

1.1 server建立的步骤

在这里插入图片描述

  1. 获取文件描述符
_sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //AF_INET:表示ipv4. SOCK_DGRAM:表示UDP

socket函数就是创建套接字,返回值_sockfd就是文件描述符。
2. 获取套接字,并填充

1.套接字的内容有哪些?

套接字是一个结构体,sockaddr是套接字。
套接字分为三种:网络套接字,域间套接字和原始套接字。

可以将网络套接字/域间套接字/原始套接字看作是套接字的子类
sockaddr_in/sockaddr_un继承自sockaddr

1. 填充套接字

主要就填充三个部分:
在这里插入图片描述

sin_family:直接填充为AF_INET就行了。

local.sin_family = AF_INET;

sin_port:直接填充我们服务器启动的端口号。

local.sin_port = _port;

sin_addr:填充为我们服务器启动的ip地址。

但是这里有一个需要注意的地方:

2.sin_addr是struct in_addr类型,ip地址是string类型,该如何进行赋值呢?

在这里插入图片描述

所以,一路往下调用,最终就是uint32_t类型。

这里的uint32_t类型是网络中的ip地址类型,我们日常使用中为了方便,采用的是点分十进制(也就是string类型)。因此,需要将string转换为uint32_t类型。

这样的转化,可以使用inet_addr()函数。

local.sin_addr.s_addr = inet_addr(_ip.c_str());
  1. 将套接字和ip地址和port端口进行绑定

3.为什么要进行绑定,之前不是已经将ip地址和port填充给套接字了吗?

在绑定之前,sockaddr_in是在栈区上的,操作系统根本不知道设的值是什么,只有使用bind之后,才真正将IP地址和端口号绑定到了操作系统中。

bind()函数接口

 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd : 之前socket()函数返回的文件描述符
  • addr:套接字。我们的套接字是sockaddr_in类型(网络套接字),因此需要强转
  • addrlen:套接字的长度,sizeof(addr)
  • 返回值:创建成功返回0,创建失败返回-1

1.2 运行server

本文想实现的功能是:客户端发送信息,服务端接收。

服务端要通过文件描述符得到客户端发来的内容,因此需要recvform()函数:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd : 创建套接字时返回的文件描述符fd。
  • buf : 用来存储从网络中读取下来的数据的。
  • len : buf缓冲区的大小。
  • flags : 读取的方式,一般设置为0,即阻塞读取数据。
  • sockaddr* src_addr : 输出型参数,同样传参sockaddr_in结构体,系统会自动对这个结构体进行填充,可以获取数据的来源,包括发送方的地址类型,端口号port以及IP地址。
  • addrlen是第五个输出型结构体变量的大小所在的地址,注意类型是socklen_t*的,和bind的时候不一样。
  • 返回值ssize_t,返回读取到的数据个数,单位是字节,如果读取失败则返回-1。

里面传的参数是指针类型的参数,都可以获得他们的值。

struct sockaddr_in client;  //记录客户端(发送方)的ip地址和端口号socklen_t len = sizeof(client);//通过recvfrom拿到client结构体的ip地址,port端口等,因为sockaddr* src_addr是输出型参数int n = recvfrom(_sockfd, inbuffer, sizeof(inbuffer) - 1, 0, (sockaddr*)&client, &len);

2 client

流程:
client需要向server发送信息,因此,需要知道server的ip地址和port。在启动的时候已经知道了。只需要将ip地址和port填充到server的套接字中就行了。最后通过sendto()函数将要写入的内容通过文件描述符写到套接字中。

2.1 client的建立步骤

client的启动方式是:./udpclient 127.0.0.0.1 8080 --> 格式就是./proc ip地址 port端口

  1. 填充server的套接字
string serverip = argv[1];
uint16_t serverport = stoi(argv[2]);struct sockaddr_in server;
bzero(&server, sizeof(server));//填充套接字结构体
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(serverip.c_str());
server.sin_port = htons(serverport);
  1. 通过socket()获取文件描述符
    过程和建立server相同。
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

4.client需要绑定吗?

客户端在发送数据时不一定需要显式绑定,因为系统会自动分配一个可用端口。客户端只需要指定目标服务器的地址和端口即可,操作系统会自动完成本地端口的分配。因此,对于客户端,bind 是可选的。

2.2 运行client

使用sendto()函数,将message的内容通过文件描述符写到server的套接字中。

string message;
char buffer[1024];while(true)
{cout << "please enter@ ";getline(cin, message);sendto(sockfd, message.c_str(), message.size(), 0, (const struct sockaddr*)&server, sizeof(server));
}

3 总结

3.1 server

  1. 根据 ./proc port的输入,得到服务器的端口
  2. 使用socket()函数获得文件描述符
  3. 填充server的套接字,包括sin_family/sin_addr/sin_port
  4. 使用bind()函数将得到的套接字和文件描述符/ip地址/port端口进行绑定
  5. 使用recvfrom()函数,通过文件描述符获得client发来的消息。可以根据recvfrom()的输出型参数获得client的套接字,从而获得client的ip地址和port端口。

3.2 client

  1. 根据 ./proc ip port的输入,得到服务器的ip地址和端口
  2. 使用socket()函数获得文件描述符
  3. 根据获得的server服务器的ip地址和端口填充server的套接字,包括sin_family/sin_addr/sin_port
  4. 使用sendto()函数将要发送的内容通过文件描述符发送server端。

代码链接:UDP通信
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460215.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别冰冷机器声:GLM-4-Voice开启情感语音交互新时代!

目录 引言一、GLM-4-Voice概述二、GLM-4-Voice的架构三、GLM-4-Voice的主要功能四、GLM-4-Voice的技术原理五、GLM-4-Voice的应用场景六、GLM-4-Voice体验快速开始结语 引言 在人工智能的不断进步中&#xff0c;语音交互技术正逐渐成为人机沟通的重要桥梁。它不仅极大地提升了…

MySQL定时异机备份

场景&#xff1a;将A机器MySQL数据库部分表每日定时备份到B机器上 &#xff08;只适用于Linux&#xff09; 实现方式算是比简单了&#xff0c;就是用mysqldump生成文件&#xff0c;使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…

使用VS2019将C#代码生成DLL文件在Unity3D里面使用(一)

系列文章目录 untiy知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、首先你要先有VS&#x1f449;二、引用UnityAPI使用步骤&#x1f449;2-1.引用unitydll文件到项目里面&#x1f449;2-2.导入Dll文件 &#x1f449;三、编辑dll代码&#x1f449;四、导出dll…

平台化运营公司如何在创业市场招商

在当今商业环境中&#xff0c;平台化运营的公司正成为推动经济发展的重要力量。对于这类公司而言&#xff0c;在创业市场招商意义重大。 平台化运营公司具有独特特点&#xff1a;通过搭建开放共享平台连接供需双方&#xff0c;实现资源优化配置与价值创造。比如电子商务平台、社…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法&#xff0c;旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面&#xff0c;我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制&#xff0c;用于处理大量文件描述符的I/O操作。它适合高并发场景&#xff0c;如网络服务器、实时数据处理等&#xff0c;是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

GRE Over IPsec(华三)

GRE Over IPsec 顾名思义&#xff0c;GRE在内&#xff0c;IPsec在外 那么当数据进入tunnel隧道后&#xff0c;会先被GRE封装后再进行IPsec感兴趣流acl匹配&#xff0c;匹配上了则封装IPsec&#xff0c;没匹配上则丢包 实验&#xff1a; 需求&#xff1a;总部pc能够通过gre o…

echarts属性之xAxis

xAxis 直角坐标系 grid 中的 x 轴&#xff0c;一般情况下单个 grid 组件最多只能放上下两个 x 轴&#xff0c;多于两个 x 轴需要通过配置 offset 属性防止同个位置多个 x 轴的重叠。 所有属性 xAxis. id string 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引…

盘点:2024年最新热门项目管理平台TOP11

一、项目管理平台的重要性 在当今竞争激烈的商业环境中&#xff0c;项目管理平台已成为企业提高效率和团队协作的关键工具。这主要是因为现代商业项目日益复杂&#xff0c;涉及多个部门、众多资源以及不断变化的需求。 首先&#xff0c;项目管理平台能够提高工作效率。例如&a…

PHP数据类型

几种常用的数据类型&#xff1a; String&#xff08;字符串&#xff09; Integer&#xff08;整型&#xff09; Float&#xff08;浮点型&#xff09; Boolean&#xff08;布尔型&#xff09; NULL&#xff08;空值&#xff09; Array&#xff08;数组&#xff09; Obje…

【大数据】Flink + Kafka 实现通用流式数据处理详解

目录 一、前言 二、流式数据处理场景介绍 2.1 流式数据处理概述 2.1.1 流式数据处理场景介绍 2.2 流式数据处理技术栈 2.2.1 数据采集 2.2.2 数据处理 2.2.3 数据存储 2.2.4 数据展示 2.3 流式数据处理场景面临的问题和挑战 三、通用的流式数据处理场景解决方案 3.1…

精准测试在基金团队应用实践

以下为作者观点&#xff1a; 一、引言 精准测试是一套计算机测试辅助分析系统&#xff0c;精准测试的核心组件包含&#xff0c;软件覆盖率分析、用例和代码的双向追踪、智能回归测试用例选取、缺陷定位、测试用例聚类分析、测试用例自动生成系统&#xff0c;这些功能完整的构…

参与国家标准制定对企业发展有哪些好处?

1. 提升企业竞争力&#xff1a; • 技术优势凸显&#xff1a;参与标准制定的过程中&#xff0c;企业能将自身先进的技术和管理理念融入标准&#xff0c;这不仅是对企业技术实力的认可&#xff0c;也能使企业在行业中占据技术制高点。 • 质量优势强化&#xff1a;国家标准对产品…

滚柱导轨出现异常损坏的原因

滚柱导轨是一种精密的直线滚动导轨&#xff0c;具有较高的承载能力和较高的刚性&#xff0c;对反复动作、起动、停止往复运动频率较高情况下可减少整机重量和传动机构及动力成本。滚柱导轨可获得较高的灵敏度和高性能的平面直线运动&#xff0c;在重载或变载的情况下&#xff0…

开发了一个成人学位英语助考微信小程序

微信小程序名称&#xff1a;石榴英语 全称&#xff1a;石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具&#xff0c;包含记高频单词&#xff0c;高频词组&#xff0c;专项练习&#xff0c;模拟考试等功能。 开发背景 个人工作需要提高学习英文水平&#xff…

基于Matlab 火焰识别技术

Matlab 火焰识别技术 课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff…

同声传译器什么好用?哪款是你的会议利器推荐榜?

眨眼之间&#xff0c;冬日的脚步悄然而至&#xff0c;又可以踏上前往东北的旅程&#xff0c;去欣赏那银装素裹的绝美雪景。 在这样一个充满异域风情和语言挑战的旅途中&#xff0c;一款顶尖的同声传译器软件无疑是旅行者的最佳伴侣。 它能帮助我们跨越语言的鸿沟&#xff0c;…

jenkins自动化构建vue(web)项目并部署(项目实战)

安装nodejs插件 系统管理>插件管理 安装完成 配置node 新建任务 根据自己情况来设置是否需要丢弃旧的构建&#xff0c;我保存了5天和5次 cd /var/jenkins_home/workspace/hainan_road_web/SDGS-YHJC/sdgs-ui npm config set registry https://registry.npmmirror.com n…

(二 上)VB 2010 设计初步

目录 一、常用类应用 1.Console类控制台 2.窗体基本控件 二、面向对象程序设计 1.类和对象 2.对象的属性、方法、事件属 1.属性 2.方法 3.事件、事件过程 1.事件 2.事件过程 3.对象浏览器 三、.NET类库与命名空间 1.命名空间 常用命名空间 1.System命名空间 2.…