当前位置: 首页 > news >正文

udp_socket

文章目录

    • UDP服务器封装
      • 系统调用socket
      • bind系统调用
      • bzero结构体清0
      • sin_family
      • 端口号
      • ip地址
      • inet_addr
      • recvfrom
      • sendto
    • 新指令 netstat -naup (-nlup)
    • 包装器 的两种类型重命名方式
      • 包装器使用统一可调用类型
    • 关键字 typedef 类型重命名
    • 系统调用popen

UDP服务器封装

在这里插入图片描述

在这里插入图片描述

系统调用socket

创建套接字

在这里插入图片描述
返回值
在这里插入图片描述
socket返回依旧是一个文件,所以创建套接字的本质,底层就是打开一个文件,以前strcut file指向的是具体某一个磁盘上的设备,只不过我们的struct file指向的底层网卡设备,他就相当于一切皆文件。

有了对应的套接字之后未来就可以使用套接字来进行收发消息,但在进行各种收发之前,我们的服务器都必须得有一个参数socket的返回值,这个套接字创建之后呢,类比文件接口,把文件创建好得到了文件描述符,从此往后所有接口想对文件交互访问都得有fd,套接字的文件描述符同理。
在这里插入图片描述
问题
服务器绑定的端口 and IP地址是什么?

bind系统调用

在这里插入图片描述
要绑定就得用这个通用结构体,但是我们用的是sockaddr_in
每个字段都有细节
sin_zero 对应 填充 不管
在这里插入图片描述

在这里插入图片描述
通用类型结构体 头文件如图

bzero结构体清0

在这里插入图片描述
使用这个结构体需要先把他清空
然后我们就填中结构题字段就可以了

在这里插入图片描述

sin_family

sockaddr_in 里面有什么?我追进去怎么没看见sin_family字段?
利用了宏替换
在这里插入图片描述
sa_family_t 实际上是短整型,我们就填对应的16位地址类型,AF_INET
在这里插入图片描述

端口号

如果今天双方通信时,我给对方发消息,对方要发消息回我,他得知道我,我就得把端口号发给过他。
说明端口号的信息将来一定要能够发送给对方的,无论客户端还是服务器也罢。
协议一个字段都没学,但网络通信本质就是进程间通信,我要把我的端口号带上还有正常消息都给对方发过去,对方处理完也能拿着我的端口号响应给我。
结论就是端口号在网络里来回发送。
所以端口号填充到结构体里必须保证他是网络字节序,因为该端口号是要给对方发送的。
这个代码在你系统里面编译是小端,必须转大端。

在这里插入图片描述

ip地址

用户使用字符串IP传入也是字符串,而结构体中是要四字节的,字符串一个字符就是一字节明显不对应,所以需要转换
在这里插入图片描述
整数转字符串
字符串转整形 想告诉大家的是互相转难度不大

在这里插入图片描述
ip地址也要在网络当中发送,不然怎么回复与相应,客户端和服务器之间。
如果IP要被网络使用,ip出了转化成4字节ip,ip还必须是网络序列的。
赋值part1-part4都是在你本机进行的计算。
把IP地址转化成网络序列的话,无非就根据当前机器是大端小端,决定赋值的顺序,要么就是part1 = 100 or part1 = 192, part1是结构体中地址最小的,192是数值权重最高的,这样写就是大端,反过来就是小端。
所以只是决定part1 到part4赋值顺序,就可以更改我们当前IP报文形成四字节是网络序列还是主机序列。
在这里插入图片描述

  1. ip必须string转四字节Ip
  2. 四字节uint32_t 类型ip 还必须是网络序列的。
    上面图里这两个功能不用我们自己做

inet_addr

他做了两件工作 字符串转uint32_t + 转大端
在这里插入图片描述

至此这个结构体的信息只是在栈上,在用户空间而不是系统空间3-4G

在这里插入图片描述
所以还没有与套接字关联,设置进内核
在这里插入图片描述
UDP核心步骤,创建套接字+绑定
基本都是固定形式,UDP就这么多。
接下来做的工作仅仅是收发消息。

在这里插入图片描述

recvfrom

在这里插入图片描述

sendto

在这里插入图片描述
flag 发送方式 设置为0

新指令 netstat -naup (-nlup)

n能显示数字,就显示数字
a all所有
u udp
p 显示pid
在这里插入图片描述
只要能用netstat 查到我们进程./udpserver就说明我们的服务器已经启动了。

今天虽然启动了,但仅仅是巧合,这里面有坑,我们得点出来。

一个关于IP
你查到本地地址 绑定的IP是0.0.0.0,那你服务期的公网IP不是0.0.0.0啊,如果我们今天绑定服务器公网IP,你就会得到如下错误

云服务器禁止直接绑定公网ip,因为它做了虚拟化
bind(IP:0.0.0.0),凡是发给我这台主机的数据,我们都要根据端口号向上交付 — 任意地址bind
因为服务器可能有两张网卡,两个Ip,你只绑定一个,另一个ip客户端的信息你就拿不上来
在这里插入图片描述
“0.0.0.0”字符串 转 uin32_t 本来就是0
所以结构体 的另一种写法
在这里插入图片描述
从今往后虚拟机可以用公网ip,但是云服务器就端口,ip就0就行
在这里插入图片描述

一个关于port
在这里插入图片描述

端口号 16位 范围0~65535
我们一般绑定8000+往上不会有问题,你非要绑系统内定就sudo 去绑,我们不建议

就想说ip绑0,端口号8000以上的,就完了。


客户端

client 需要socket创建套接字,socket创建的网络文件描述符不用就close 关掉
在这里插入图片描述

那client需要bind吗?
客户端一定要绑定,要有自己的ip和端口,这是套接字通信,客户端也要唯一性标识。
所以要!
只不过不需要用户显示的bind! 一般由os自由随机选择。

服务器的IP和端口不要一直变,不能随机绑定,让客户端找不到,他只能由程序员来绑是确定的。

而客户端的ip和端口是多少,其实不重要,只要保证主机上的唯一性就可以。
全是由客户端给服务器发信息,服务器就能知道客户端是谁,ip port如何如何

所以系统什么时候给我bind呢?
首次发送数据的时候!

那客户端怎么知道他要发给谁,请求那个服务器的ip port
这个工作由我们来做,通过命令行参数让用户输入请求的ip port
在这里插入图片描述
怎么发
1.发什么数据 – 输入字符串
2.给谁发
我们可不止需要ip+port,同样需要构建struct sockaddr_in结构体

在这里插入图片描述
今天客户端有可能从不同的服务器收发消息吗?
客户端一气发给好几个服务器ip 的sendto,所以有可能
有可能,但今天我们就一个

在这里插入图片描述
最后客户端发什么字符串,服务器就给我返回什么字符串
就这样一来一回
在这里插入图片描述

域名其实就是ip地址
服务器一般做推广自己的域名ip,服务器的端口号约定好
今天我们客户端是利用命令行参数来进行直接绑定,服务器裸露自己的Ip和端口号

在这里插入图片描述

包装器 的两种类型重命名方式

你可以把包装器当成函数指针
在这里插入图片描述

包装器使用统一可调用类型

在这里插入图片描述

在这里插入图片描述

关键字 typedef 类型重命名

一般是重命名在默认类型 后面 ,函数指针是中间
在这里插入图片描述

把收发数据 和 处理数据 做解耦
让main函数中调用Run方法时传入一个func_t类型的可调用类型方法,处理完数据再把结果发回去
在这里插入图片描述

在这里插入图片描述

服务器收到消息把消息传递给我传进来的这个回调函数func,回调函数会把数据回调式的处理,处理完成之后把结果返回。

这样做的本质是对代码进行分层。
就是不要把字符串的处理放在我们的代码当中
在这里插入图片描述
直接使用我们传进来的方法,在上层不关心网络通信了,消息是什么样的做加工处理就行。你可以返回echo 服务期简单的处理,也可以传入不同的回调方法处理命令返回结果。
在这里插入图片描述

没人规定网络udp只能发送字符串,我们也可以认为发送的是命令啊,在服务器上创建进程再把命令执行的结果返回
在这里插入图片描述
这样写费时间,我们可以利用popen

系统调用popen

在这里插入图片描述

封装起来的管道,和子进程执行命令的应用,,popen作用是把执行命令以字符串的形式给我,popen底层我会帮你fork,我会让父子进程建立管道,让子进程把结果通过管道返回给调用方,调用方如果想得到command运行结果,你可以通过文件指针方式读取,type如果是r相当于读方式打开文件。
在这里插入图片描述
UDP应用场景

  1. ExcuteCommand
  2. 简单聊天室
  3. windows端的客户端访问Linux服务期

在这里插入图片描述

相关文章:

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen UDP服务器封装 系统调用socket …...

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好!我是凯哥,今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线,并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的,花费了不少精力哦,希望对…...

【Golang】手搓DES加密

代码非常长 有六百多行 参考一位博主的理论实现 通俗易懂,十分钟读懂DES 还有很多不足的地方 感觉只是个思路 S盒(理论既定) package src// 定义S - 盒的置换表 var SBoxes [8][4][16]int{{{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, …...

YouQu使用手册【元素定位】

元素定位 文章目录 前言一、气泡识别二、不依赖OpenCV的图像识别方案三、动态图像识别四、背景五、sniff(嗅探器)使用六、元素操作七、框架封装八、背景【OCR识别】九、实现原理十、使用说明十一、RPC服务端部署十二、负载均衡十三、链式调用十四、背景【相对坐标定位】十五、…...

Spark RDD sortBy算子什么情况会触发shuffle

在 Spark 的 RDD 中,sortBy 是一个排序算子,虽然它在某些场景下可能看起来是分区内排序,但实际上在需要全局排序时会触发 Shuffle。这里我们分析其底层逻辑,结合源码和原理来解释为什么会有 Shuffle 的发生。 1. 为什么 sortBy 会…...

机器视觉相机重要名词

机器视觉相机的重要名词包括: • 工业数字相机:又称工业相机,是机器视觉系统中的关键组件。 • 电荷偶合元件(CCD):一种图像传感器,能将光学影像转换为数字信号。 • 互补金属氧化物半导体&…...

Django:从入门到精通

一、Django背景 Django是一个由Python编写的高级Web应用框架,以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发,旨在简化Web应用的开发过程。作为一个开放源代码项目,Django迅速吸引了大量的开发…...

android viewpager2 嵌套 recyclerview 手势冲突

老规矩直接上代码, 不分析: import android.content.Context import android.util.AttributeSet import android.view.MotionEvent import android.view.View import android.view.ViewConfiguration import android.view.ViewGroup import android.widg…...

依赖管理(go mod)

目录 各版本依赖管理的时间分布 一、GOPATH 1. GOROOT是什么 定义: 作用: 默认值: 是否需要手动设置: 查看当前的 GOROOT: 2. GOPATH:工作区目录 定义: 作用&#xff1a…...

Apple Vision Pro开发001-开发配置

一、Vision Pro开发硬件和软件要求 硬件要求软件要求 1、Apple Silicon Mac(M系列芯片的Mac电脑) 2、Apple vision pro-真机调试 XCode15.2及以上,调试开发和打包发布Unity开发者账号&&苹果开发者账号 二 、开启无线调试 1、Apple Vision Pro和Mac连接同…...

android 动画原理分析

一 android 动画分为app内的view动画和系统动画 基本原理都是监听Choreographer的doframe回调 二 app端的实现是主要通过AnimationUtils来实现具体属性的变化通过invilate来驱动 wms来进行更新。这个流程是在app进程完成 这里不是我分析的重点 直接来看下系统动画里面的本地动…...

Elasticsearch 6.8 分析器

在 Elasticsearch 中,分析器(Analyzer)是文本分析过程中的一个关键组件,它负责将原始文本转换为一组词汇单元(tokens)。 分析器由三个主要部分组成:分词器(Tokenizer)、…...

实验室资源调度系统:基于Spring Boot的创新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1:完成网络部署 2、任务 2:设计全网 IP 地址 3、任务 3:实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …...

3. SQL优化

SQL性能优化 在日常开发中,MySQL性能优化是一项必不可少的技能。本文以具体案例为主线,结合实际问题,探讨如何优化插入、排序、分组、分页、计数和更新等操作,帮助你实现数据库性能的飞跃。 一、索引设计原则 索引是MySQL优化的…...

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码, $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是:从 $file_name 中去除所有出现在 $deny_ext 数组中的元素,替换为空字符串(即删除这些元素)。str_ireplace() 在处理时…...

AWS CLI

一、AWS CLI介绍 1、简介 AWS CLI(Amazon Web Services Command Line Interface)是一个命令行工具,它允许用户通过命令行与 Amazon Web Services(AWS)的各种云服务进行交互和管理。使用 AWS CLI,用户可以直接在终端或命令行界面中执行命令来配置、管理和自动化AWS资源,…...

springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。 当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。 属于行为型模式…...

CentO7安装单节点Redis服务

本文目录 一、Redis安装与配置1.1 安装redis依赖1.2 上传压缩包并解压1.3 编译安装1.4 修改配置并启动1、复制配置文件2、修改配置文件3、启动Redis服务4、停止redis服务 1.5 redis连接使用1、 命令行客户端2、 图形界面客户端 一、Redis安装与配置 1.1 安装redis依赖 Redis是…...

FreeRTOS学习14——时间管理

时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中,频繁地使用了 FreeRTOS 提供的延时函数&#xff0c…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...

HTML版英语学习系统

HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具&#xff0c;使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章&#xff0c;系统朗读帮助练习听力和发音&#xff0c;适合跟读练习&#xff0c;模仿学习&#xff1b;实时词典查询 - 双…...