socket UDP 环路回显的服务端
基于socket通讯的方式,无论用http或者udp或者自定义的协议,程序结构都是类似的。这个以UDP协议为例简要说明。
#include <stdio.h> // 标准输入输出库
#include <sys/types.h> // 提供了一些数据类型,如ssize_t
#include <sys/socket.h> // 提供socket编程的接口
#include <netinet/in.h> // 提供IPv4和IPv6地址的结构体定义
#include <arpa/inet.h> // 提供网络地址转换的函数,如inet_pton和inet_ntop(注意:这里应该是<arpa/inet.h>的拼写错误,正确的是<arpa/inet.h>,但您已经写对了)
#include <unistd.h> // 提供对POSIX操作系统API的访问,如close函数
#include <stdlib.h> // 标准库,提供内存分配、程序退出等函数
#include <sys/stat.h> // 提供对文件状态的操作,本程序中未使用
#include <fcntl.h> // 提供对文件控制的操作,如文件描述符的设置,本程序中未使用
#include <string.h> // 提供字符串处理的函数,如bzero#define N 64 // 定义缓冲区的大小int main(int argc, char const *argv[]) // 程序的主入口
{int sockfd; // 声明socket文件描述符sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP socketif(sockfd < 0) // 检查socket是否创建成功{perror("sock err"); // 如果创建失败,打印错误信息return -1; // 并返回-1表示错误}// 绑定套接字(ip+port)struct sockaddr_in addr; // 声明一个IPv4地址的结构体addr.sin_family = AF_INET; // 设置地址族为IPv4addr.sin_port = htons(atoi(argv[2])); // 将命令行参数转换为整数,并转换为网络字节序后设置为端口号// 自动绑定所有的本机网卡的地址addr.sin_addr.s_addr = INADDR_ANY; // 设置IP地址为INADDR_ANY,表示绑定到所有可用的网络接口int addrlen = sizeof(addr); // 获取地址结构体的长度if(bind(sockfd, (struct sockaddr *)&addr, addrlen) < 0) // 绑定socket到指定的地址和端口{perror("bind err"); // 如果绑定失败,打印错误信息return -1; // 并返回-1表示错误}ssize_t len; // 声明一个变量来存储接收到的数据长度char buf[N] = {0}; // 声明并初始化一个缓冲区来存储接收到的数据struct sockaddr_in cliaddr; // 声明一个结构体来存储客户端的地址信息// cliaddr接收客户端的地址while (1) // 进入一个无限循环来等待客户端的数据{bzero(buf, N); // 清空缓冲区len = recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&cliaddr, &addrlen); // 从socket接收数据if(len > 0) // 如果成功接收到数据{printf("recv data=%s\n", buf); // 打印接收到的数据sendto(sockfd, buf, len, 0, (struct sockaddr *)&cliaddr, addrlen); // 将接收到的数据发送回客户端(注意:这里应该使用len而不是N)}}// 关闭socket(注意:由于有无限循环,这行代码实际上永远不会被执行)close(sockfd); // 关闭socket以释放资源return 0; // 程序正常结束
}
程序功能
这个程序实现了一个简单的UDP服务器,它监听一个指定的端口,接收来自客户端的数据,并将接收到的数据原封不动地发送回客户端(回显服务器)。
程序结构
- 初始化:创建socket,设置地址和端口,绑定socket。
- 接收数据:进入一个无限循环,等待并接收来自客户端的数据。
- 处理数据:打印接收到的数据,并将数据发送回客户端。
- 关闭socket(实际上不会被执行):在循环结束后关闭socket。
UDP发送和接收函数的参数
recvfrom()
函数:sockfd
:socket文件描述符。buf
:指向存储接收数据的缓冲区的指针。len
:缓冲区的大小。flags
:标志位,通常设置为0。src_addr
:指向存储发送方地址信息的结构体的指针。addrlen
:指向存储地址结构体长度的变量的指针。
sendto()
函数:sockfd
:socket文件描述符。buf
:指向要发送的数据的缓冲区的指针。len
:要发送的数据的长度(注意:这里应该使用实际接收到的数据长度,而不是缓冲区的大小)。flags
:标志位,通常设置为0。dest_addr
:指向存储接收方地址信息的结构体的指针。addrlen
:地址结构体的长度。
其中:
sockaddr_in
结构体在 IPv4 网络编程中用于表示一个 Internet 地址。这个结构体定义在 <netinet/in.h>
头文件中(在 POSIX 兼容的系统中),并且它通常用于 bind()
, connect()
, sendto()
, recvfrom()
等网络相关的系统调用中,以指定或接收网络地址信息。
sockaddr_in
结构体的定义:
struct sockaddr_in {sa_family_t sin_family; // 地址族,对于 IPv4 来说是 AF_INETuint16_t sin_port; // 端口号,使用网络字节序(大端模式)struct in_addr sin_addr; // IPv4 地址,也使用网络字节序// 在某些实现中,可能有一个用于填充的数组,以确保结构体大小与 sockaddr 一致// char sin_zero[8]; // 这通常用于保持结构体大小的一致性,但现代代码通常不直接使用它
};
-
sin_family
:这是一个sa_family_t
类型的字段,用于指定地址族。对于 IPv4 地址,它应该被设置为AF_INET
。 -
sin_port
:这是一个uint16_t
类型的字段,用于指定端口号。端口号应该以网络字节序(大端模式)存储,这通常意味着在将主机字节序(小端模式或大端模式,取决于具体的系统架构)的端口号传递给网络之前,需要使用htons()
函数进行转换。 -
sin_addr
:这是一个struct in_addr
类型的字段,它包含了一个 IPv4 地址。IPv4 地址也应该以网络字节序存储。struct in_addr
通常定义为一个包含单个uint32_t
类型字段s_addr
的结构体,用于存储 32 位的 IPv4 地址。 -
sin_zero
:在某些实现中,sockaddr_in
结构体可能包含一个名为sin_zero
的字符数组字段,用于填充,以确保结构体的大小与更通用的sockaddr
结构体一致。然而,在现代的网络编程实践中,这个字段通常不被直接使用,而且可能在一些实现中根本不存在。如果你的系统定义中包含了这个字段,你通常不需要关心它,只需要确保在初始化sockaddr_in
结构体时将其清零(尽管这通常不是必需的,因为系统调用通常只关心sin_family
,sin_port
, 和sin_addr
字段)。
在使用 sockaddr_in
结构体时,你需要确保正确地设置 sin_family
, sin_port
, 和 sin_addr
字段,并且如果 sin_zero
字段存在,也最好将其清零(尽管这通常不是错误源)。然后,你可以将这个结构体的地址作为参数传递给网络相关的系统调用。
相关文章:
socket UDP 环路回显的服务端
基于socket通讯的方式,无论用http或者udp或者自定义的协议,程序结构都是类似的。这个以UDP协议为例简要说明。 #include <stdio.h> // 标准输入输出库 #include <sys/types.h> // 提供了一些数据类型,如ssize_t #include <sy…...
单例模式的缺点
1. 违反单一职责原则 单例模式不仅管理对象的实例化,还负责提供对该实例的全局访问。这使得单例类承担了过多的职责。复杂的单例类可能变得难以维护和扩展。 2. 难以进行单元测试 单例模式引入了全局状态,使得测试环境中的依赖关系难以隔离。在测试中…...
如何通过看板进行跨境电商的圣诞商品数据分析与优化选品流程?
引言 随着圣诞季的临近,跨境电商迎来了重要的销售时机。选品工作对于跨境电商的成功至关重要,直接关系到销售业绩和利润。本文结合相关网页信息,深入探讨跨境电商在圣诞期间如何利用信息整合工具展开选品工作,并优化选品流程。同…...
【Linux】vi/vim 使用技巧
文章目录 1. 简介vi和vim的历史vi和vim的区别安装vimUbuntu/DebianCentOS/RHELFedoramacOSWindows 2. 基本操作启动和退出启动退出 模式介绍普通模式插入模式命令模式 光标移动基本移动高级移动 3. 文本编辑插入文本删除文本复制和粘贴撤销和重做 4. 搜索与替换基本搜索搜索文本…...
React的功能是什么?
以下是一些React的主要功能和特点: 组件化架构: React将UI拆分为可复用的独立组件,每个组件负责一部分UI的逻辑和展示。组件可以嵌套使用,形成复杂的UI结构。 虚拟DOM: React使用虚拟DOM来管理UI的状态和更新ÿ…...
【6】数据分析检测(DataFrame 1)
学习目标3 昨天,我们学习了Series。 而Pandas的另一种数据类型:DataFrame,在许多特性上和Series有相似之处。 今天,我们将学习DataFrame的相关知识: 1. DataFrame的概念 2. 构造一个DataFrame 3. DataFrame的常用…...
React初体验 - [Next.js项目]
效果 须知 Next.js与React有哪些区别?https://juejin.cn/post/7112334604027035655 React中文手册 https://react.docschina.org/learn/start-a-new-react-project Next.js中文手册 https://www.nextjs.cn/docs/getting-started 步骤 npx提速 - 更换npm国内源 - 参考文档 …...
学生信息管理系统(简化版)
前端部分(vue2) !!前端采用vue2框架,下面只写出必要的代码文件,想要使用需自行先创建vue项目 部分截图 下面是目录结构 下面是public文件夹里面的html文件 <!DOCTYPE html> <html lang"&q…...
网易云信荣获“HarmonyOS NEXT SDK星河奖”
近日,鸿蒙生态伙伴 SDK 开发者论坛在北京举行。 网易云信凭借在融合通信领域的技术创新和鸿蒙生态贡献,荣获鸿蒙生态“HarmonyOS NEXT SDK星河奖”。 会上,华为鸿蒙正式推出 SDK 生态繁荣伙伴支持计划,旨在为 SDK 领域伙伴和开发…...
Java版-图论-最小生成树-Prim算法
实现描述 如图: Prim算法的基本思想是从一个顶点开始,逐步构建最小生成树。具体步骤如下: 随机选取一个顶点作为起始点,并将其加入最小生成树的集合中。从该顶点出发,选择一条边连接到其他未被访问的顶点中的最小权值边。将该顶点加入到最小生成树的集合中,并标记为已…...
python-@property 和setter属性
T 一个装饰器,使得类中方法像属性一样被使用。 W 这是原本的类及其属性的访问 class Person():def __init__(self, firstname:str, lastname:str):self.first firstnameself.last lastnameself.full_name self.first self.lastdef printFullname(self):re…...
es有string类型字段吗
在较新的版本的 Elasticsearch (ES) 中,string 类型已经被移除,取而代之的是更具体的 text 和 keyword 类型。这一改变是在 Elasticsearch 5.0 版本引入的,目的是为了提供更好的性能和更明确的数据处理方式。 Text 类型 用途:text 类型用于全文搜索。当你有一个字段需要进…...
shell编程入门之提取字符并设置rtc时间
awk用法 awk是一款文本处理工具,通常在Unix和Linux操作系统中使用,用于以行为单位对文本进行处理和操作。它可以读取输入文本,对其进行处理,生成报表、统计信息等,并将结果输出到标准输出设备中。 它主要有以下特点&…...
数据库进阶教程:结合编程实现动态数据操作
在前一篇文章中,我们了解了数据库的基础知识及其核心操作。这次,我们将通过编程语言(以 Python 为例)与数据库进行交互,进一步提升你的数据库应用能力。我们将学习如何通过代码完成数据的插入、查询、更新和删除&#…...
高效可靠:吉客云数据集成到MySQL技术详解
测试-查询货品供应商报价-dange:吉客云数据集成到MySQL的技术案例分享 在现代企业的数据管理中,如何高效、可靠地实现不同系统之间的数据对接是一个关键问题。本文将聚焦于一个具体的系统对接集成案例——将吉客云的数据集成到MySQL数据库中,…...
docker安装ddns-go(外网连接局域网)
docker先下载镜像,目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…...
hbuilder 安卓app手机调试中基座如何设置
app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】,点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…...
【pyspark学习从入门到精通23】机器学习库_6
目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征,而且只用一个系数很难拟合到我们的模型中。 在这种情况下,可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时,将值划分到离散的桶中…...
Postman高阶技能:Collection集合批量运行!
01、Collection(集合)介绍 当我们对一个或多个系统中的很多接口用例进行维护时,首先想到的就是对接口用例进行分类管理,同时还希望对这批接口用例做回归测试。 在 Postman 中也提供了这样一个功能,就是 Collection&a…...
ipset搭配iptables实现城市IP访问限制
最近刷了一台飞牛os,但是没有二次验证的功能,裸奔在公网上,看着让人揪心。于是最近研究了一下,设置防火墙只让某些城市能够访问设备,这样大大降低了服务器的风险,因为大多数被黑的原因都是来自国外。 1.下…...
WPF表格控件的列利用模块适配动态枚举类
将枚举列表转化到类内部赋值,在初始化表格行加载和双击事件时,触发类里面的枚举列表的赋值 <c1:Column Header"变更类型" Binding"{Binding ChangeType, ModeTwoWay, ValidatesOnExceptionsTrue, ValidatesOnDataErrorsTrue, NotifyOn…...
java引用相关(四大引用类型,软引用避免oom,弱引用表,虚引用和引用队列,可达性分析算法)
1. 什么是引用? 问题:什么是引用?Java中的引用是如何工作的? 答案: 引用 是对象的句柄,用于访问堆内存中的对象。在Java中,引用变量实际上存储的是对象的地址,而不是对象本身。通…...
图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。
图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。 目录 图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基…...
2、开发环境优化与创建第一个插件程序
一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…...
Android CoordinatorLayout:打造高效交互界面的利器
目录 一、CoordinatorLayout 介绍及特点 二、使用方法 2.1 创建 CoordinatorLayout 布局 2.2 添加需要协调的子视图 2.3 自定义 Behavior 三、结语 相关推荐 在Android开发中,面对复杂多变的用户界面需求,CoordinatorLayout以其强大的交互管理能力…...
计算机视觉:学习指南
一、引言 计算机视觉作为人工智能领域的一个重要分支,致力于让计算机理解和解释视觉信息,近年来取得了令人瞩目的进展,广泛应用于安防监控、自动驾驶、图像编辑、医学影像分析等众多领域。从入门到精通计算机视觉需要系统地学习一系列知识和…...
创建型设计模式
一、设计模式介绍 1.设计模式是什么 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案; 2.设计模式怎么来的? 满足设计原则后,慢慢迭代出来的。 3.设…...
【Ubuntu】使用ip link工具创建虚拟局域网并配置?
🦋🦋🦋如何使用ip link工具创建虚拟局域网? sudo ip link add link enx888bd66b7000 name enx.120 type vlan id 120 上述命令使用ip link工具在Linux系统中创建了一个新的虚拟局域网(VLAN)接口,…...
川渝地区软件工程考研择校分析
通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西南交通大学软件工程学硕。该校24届软件工程学硕实际录取1…...
云原生基础设施指南:精通 Kubernetes 核心与高级用法
1. 云原生的诞生 随着互联网规模的不断增长,以及企业对敏捷开发、快速交付和高可用性的需求日益增强,传统的单体架构逐渐暴露出局限性,难以满足现代业务对动态扩展和高效迭代的要求。为此,云原生应运而生。 云原生是为云计算时代…...
Pyinstaller使用指南以及遇到的问题
一、在cmd命令行执行安装pyinstaller工具 pip install pyinstaller 二、在命令行中执行打包命令即可 格式如下: pyinstaller [opts] yourprogram.py 参数含义 -F 指定打包后只生成一个exe格式的文件(建议写上这个参数) -D –onedir 创建一个目录,包含…...
美图撕掉蔡文胜标签
卖掉比特币的美图不投机了。 作者|周立青 编辑|杨舟 12月5日,比特币突破10万美元大关,曾花费1亿美元购入虚拟货币的美图宣布已出售所有加密货币。 美图在港交所发布公告称,自2024年11月起,公司已开始出售其持有的加密货币&…...
【Spring】IoC和DI,控制反转,Bean对象的获取方式
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:什么是IoC 1:什么是容器 2:什么是IoC 二:IoC应用…...
【015】对文件进行压缩_#py
对文件进行压缩 1. 下载7z软件2. 调用exe文件3. 压缩和分卷压缩4. 完整代码 1. 下载7z软件 从官网下载https://www.7-zip.org/软件。 2. 调用exe文件 主要是通过 subprocess 调用对应的command的命令。 subprocess.run(command, checkTrue)其中 command 的应包含7z软件的ex…...
OD C卷【智能成绩表】
题目 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名。 输入描述: 第一行输入学生人数n、科目数量m; 0<n<100; 0<m<10 第二行输入m个科目名称,以空格分开;科目只由英文字母构成,长度不超过…...
开源架构与云计算的传奇融合
开源架构与云计算的传奇融合 一、引言二、开源架构与云计算的卓越优势(一)成本效益惊世骇俗(二)灵活性与可扩展性无与伦比(三)社区支持与创新活力爆棚 三、震撼应用案例剖析(一)容器…...
【SpringBoot-事件监听】
文章目录 1. 定义事件2. 创建监听器3. 发布事件注意事项 在Spring Boot中,事件监听是一种常用的机制,用于在应用程序的不同部分之间进行松耦合的通信。Spring Boot基于Spring框架,因此它继承了Spring的事件发布和监听机制。以下是如何在Sprin…...
【docker】springboot 服务提交至docker
准备docker (不是docker hub或者harbor,就是可以运行docker run的服务),首先确保docker已经安装。 本文以linux下举例说明: systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…...
Facebook广告突然无消耗?原因解析与解决方案。
在Facebook广告投放中,广告突然无消耗是很多广告主都会遇到的难题。这种情况不仅浪费时间,还可能导致营销活动停滞,影响业务发展。那么,广告无消耗的原因是什么?又该如何解决呢? 一、Facebook广告无消耗的…...
05 在 Linux 使用 AXI DMA
DMA简介 DMA 是一种采用硬件实现存储器与存储器之间或存储器与外设之间直接进行高速数据传输的技术,传输过程无需 CPU 参与(但是CPU需要提前配置传输规则),可以大大减轻 CPU 的负担。 DMA 存储传输的过程如下: CPU 向…...
android AIDL ipc binder转换
一. 概述 众所周知AIDL并不是所有的数据类型都可以传输。 可以传输的类型包括: 1.原生类型 2.String 3. CharSequence 4. List 5.Map 6. Binder 7. Parcelable 容器类 parcelable传输的时候会分解成成员,数组item的方式,传输完成后再进行…...
【docker】12. Docker Volume(存储卷)
什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。 在宿主机上…...
1. 机器学习基本知识(4)——机器学习测试和验证
1.6 测试和验证 了解模型对新实例的泛化能力的唯一方法是在新实例上进行实际尝试。 一种方法是将模型部署到生产环境并监控其性能。 这种方法很有效,但如果模型非常糟糕,你的用户就会抱怨,所以这显然不是最好的方法。 更好的选择是将数…...
生成式AI概览与详解
1. 生成式AI概览:什么是大模型,大模型应用场景(文生文,多模态) 生成式AI(Generative AI)是指通过机器学习模型生成新的数据或内容的人工智能技术。生成式AI可以生成文本、图像、音频、视频等多种…...
软件项目标书参考,合同拟制,开发合同制定,开发协议,标书整体技术方案,实施方案,通用套用方案,业务流程,技术架构,数据库架构全资料下载(原件)
1、终止合同协议书 2、项目合作协议 3、合同交底纪要 4、合同管理台账 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单&…...
C++ extern “C“ 用法
extern “C” 由于c中需要支持函数重载,所以c和c中对同一个函数经过编译后生成的函数名是不相同的 extern “C” 的主要作用就是为了实现c代码能够调用其他 c 语言代码。 1(不常用) //告诉编译器 show() 函数按c语言的方式进行编译和链接 extern "C" voi…...
Node.js(v16.13.2版本)安装及环境配置教程
一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本,这里我选择的是Windows系统、64位(v16.13.2版本) 下载后的zip文件 二、解压文件到nodejs,并打开文件夹nodejs,复制解压…...
父组件调用子组件的方法
父组件 在父组件中调用子组件的sayHello()函数 <template><div><button click"getChild(wendu)">触发子组件方法wendu</button><button click"getChild(shidu)">触发子组件方法shidu</button><el-dialog v-model…...
运维排错系列:Excel上传失败,在剪切板有大量信息。是否保存其内容...
问题点 在导入 Excel 数据到 SAP 的时候,某些时刻系统会出现如下的弹窗。 上载 excel 文件时,您会收到错误:“剪贴板上有大量信息。XXX” Microsoft Office Excel 的弹出窗口显示以下信息: 剪贴板上存在大量信息。是否保留其内容…...
【自学】Vues基础
学习目录 Vues基础本地应用网络应用综合应用 工具的准备 我个人比较喜欢使用HTMLDROWNER,学习资料推荐使用VC,仅供选择吧 前置知识 HTMLCSSJSAJAX:这个是学习资料博主推荐的 个人感觉认真学好HTMLCSSJS理解vues基础很容易上手 官方网址…...