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报文形成四字节是网络序列还是主机序列。

- ip必须string转四字节Ip
- 四字节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应用场景
- ExcuteCommand
- 简单聊天室
- 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:工作区目录 定义: 作用:…...
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 提供的延时函数,…...
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 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
