udp服务器【Linux网络编程】
目录
一、UDP服务器
1、创建套接字
2、绑定套接字
3、运行
1)读取数据
2)发送数据
二、UDP客户端
创建套接字:
客户端不用手动bind
收发数据
处理消息和网络通信解耦
三、应用场景
1、服务端执行命令
2、Windows上的客户端
3、简易聊天室
四、可能遇到的问题
一、UDP服务器
1、创建套接字
int socket(int domain,int type,int protocol)
第一个参数表示要创建的套接字的协议家族和域是什么,如下图第一个表示本地通信,第二个表示IPv4的网络通信。
AF_INET也可以写成PF_INET
第二个参数表socket的类型:
SOCK_STREAM:流式套接字(面向字节流eg:TCP)
SOCK_DGRAM:数据报套接字(面向数据报eg:UDP)
第三个参数表示协议类型:填0就行
返回值:文件描述符(网卡设备)
2、绑定套接字
int bind(int sockfd,const struct sockaddr *add,socklen_t addrlen)
关于第二个参数:由于是网络通信,所以我们要先定义一个sockaddr_in(#include <arpa/inet.h>)对象,并把它的值填好。
将指定大小的数据清0
整数ip和字符串ip如何转换?
同时,ip也得是网络字节序。
inet_addr():将字符串ip转整数并保证其时网络字节序。
有了上面两个部分,服务器就初始化成功了。
3、运行
服务器要一直运行。
客户端将数据发送给服务器后,服务器进行处理,再将数据返回给客户端。
1)读取数据
sockfd是接收方的套接字描述符
buf是用来接收数据的。
src_addr是用来接收发送方的信息的。
flags设置为0即可
2)发送数据
sockfd:发送方套接字描述符
buf:指向要发送的数据的缓冲区
len:缓冲区大小
flags:0
dest_addr:接收方结构体指针
addrlen:结构体大小
通过指令判断服务器是否启动
一个关于IP的问题
如果我们用自己的云服务器IP来初始化服务器,会出现以下报错:
云服务器禁止直接绑定公网IP。一般服务器也不会固定绑定一个IP,因为每台机器可能有多个IP,多个IP都可以放出去,如果服务器只绑定一个IP,那就只能收到发往这一个IP的消息。
bind不填IP地址,就写0(任意地址绑定),让它根据端口号向上交付,这样就可以接收本台主机发给多个IP的消息。
所以,服务器就不需要ip这个字段了。
一个关于端口号的问题
【0,1023】:是系统内定的端口号,一般都有固定的应用层协议使用(http:80 https:443)我们要用1024及以上的端口号,同时,即便是1024以上,某些特定端口号也建议不要使用,如mysql:3306……
用命令行:
下面是将服务器处理数据的部分分离出来的过程:
好处:代码分层,上层就不用关心网络通信了。
二、UDP客户端
创建套接字:
客户端不用手动bind
服务器的端口号必须是确定的(因为客户端要知道服务器的IP和端口号),而客户端只要保证唯一性就行。
用户需要传入服务器的ip和port
收发数据
因为客户端有可能向多个服务器发起请求,那么就会有多个服务器发来响应报文,所以接收消息时,需要知道是谁发来的。
处理消息和网络通信解耦
function是C++内置的函数对象,上面这行代码定义了一个类型,func_t即一个返回值为string,参数为const string &的函数,func_t可以作为参数类型,即可将这样的一个函数作为参数传递。
也可以这样写:
三、应用场景
1、服务端执行命令
1)建立管道
2)创建子进程,让子进程程序替换执行command
补充:127.0.0.1是本地环回地址(走了底层的网络协议栈,但并不推送到网络),通常同来进行客户端和服务器的测试
2、Windows上的客户端
注意:WinSock2.h要在Windows.h之前
后面的代码与Linux上基本类似
3、简易聊天室
理论上是要写一个注册登录的操作的,但此处为了方便,我们就直接用ip来标识每个人
如果没有出现过这个ip,就将这个client添加到unordered_map里(相当于进群)
将消息广播:
udp的socket是全双工的,允许被同时读写
下面就来验证一下:
之前写的客户端是要发一条消息,才会收到消息,这样其实就不符合我们平时群聊的逻辑,接下来用多线程改一下:
两个线程,一个收,一个发
线程要用的数据:
补充:关于inet_ntoa
char* inet_ntoa(struct in_addr inaddr);
这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip的结果,man手册上说, inet_ntoa函数, 是把这个返回结果放到了静态存储区. 这个时候不需要我们手动进行释放。
但如果我们多次调用这个函数,结果会出现覆盖的情况:
在AUPE中说这个函数不是线程安全的函数,但在centos7上测试没有出现问题,可能是其内部加了互斥锁,因此推荐使用以下函数:
const char* inet_ntop(int family,const void *addrptr,char* strptr,size_t len);
四、可能遇到的问题
1、云服务器要设置安全组,开发端口号
2、登录xshell时的ip是虚拟ip,要用ifconfig指令查真正的ip
相关文章:

udp服务器【Linux网络编程】
目录 一、UDP服务器 1、创建套接字 2、绑定套接字 3、运行 1)读取数据 2)发送数据 二、UDP客户端 创建套接字: 客户端不用手动bind 收发数据 处理消息和网络通信解耦 三、应用场景 1、服务端执行命令 2、Windows上的客户端 3…...

【k8s资源调度-Deployment】
1、标签和选择器 1.1 标签Label 配置文件:在各类资源的sepc.metadata.label 中进行配置通过kubectl 命令行创建修改标签,语法如下 创建临时label:kubectl label po <资源名称> apphello -n <命令空间(可不加࿰…...

【Oracle】玩转Oracle数据库(五):PL/SQL编程
前言 嗨,各位数据库达人!准备好迎接数据库编程的新挑战了吗?今天我们要探索的是Oracle数据库中的神秘魔法——PL/SQL编程!🔮💻 在这篇博文【Oracle】玩转Oracle数据库(五)࿱…...

JavaScript流程控制
文章目录 1. 顺序结构2. 分支结构2.1 if 语句2.2 if else 双分支语句2.3 if else if 多分支语句三元表达式 2.4 switch 语句switch 语句和 if else if语句区别 3. 循环结构3.1 for 循环断点调试 3.2 双重 for 循环3.3 while 循环3.4 do while 循环3.5 contiue break 关键字 4. …...
五个使用Delphi语言进行开发的案例
案例一:学生信息管理系统 某学校需要开发一个学生信息管理系统,用于记录学生的基本信息、成绩和考勤情况等。开发者使用Delphi语言进行开发,设计了一个包含多个窗体的应用程序。主窗体用于展示学生的列表和基本信息,其他窗体则用…...
蓝桥杯第1374题——锻造兵器
题目描述 小明一共有n块锻造石,第块锻造石的属性值为ai. 现在小明决定从这n块锻造石中任取两块来锻造兵器 通过周密计算,小明得出,只有当两块锻造石的属性值的差值等于C,兵器才能锻造成功 请你帮小明算算,他有多少种选…...

坚鹏:政府数字化转型数字机关、数据共享及电子政务类案例研究
政府数字化转型数字机关、数据共享及电子政务类案例研究 课程背景: 很多地方政府存在以下问题: 不清楚政府数字化转型的数字机关类成功案例 不清楚政府数字化转型的数据共享类成功案例 不清楚政府数字化转型的电子政务类成功案例 课程特色&…...

【架构】面向人工智能 (AI) 的硬件的可靠性(2021)
由于激进的技术扩展,现代系统越来越容易受到可靠性威胁的影响,例如软错误、老化和工艺变化。这些威胁在硬件级别表现为位翻转,并且根据位置,可能会损坏输出,从而导致不准确或潜在的灾难性结果。 传统的缓解技术基于冗…...
Unity3D MVC开发模式与开发流程详解
前言 MVC(Model-View-Controller)是一种常用的软件架构模式。将MVC应用于Unity3D开发可以提高项目的可维护性和可扩展性,使代码更加清晰和易于理解。本文将详细介绍Unity3D中MVC开发模式的应用以及开发流程,并给出技术详解和代码…...
简单介绍一下Android里面的IntentFirewall
源码链接 https://android.googlesource.com/platform/frameworks/base//633dc9b/services/java/com/android/server/firewall/IntentFirewall.java 源码如下: package com.android.server.firewall; import android.content.Intent; import android.content.Inte…...

Stable Diffusion 3 发布及其重大改进
1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后,Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说,我们快来看看吧! 2. 什么是Stable Diffusion…...
【后端】springboot项目
文章目录 1. 2.3.7.RELEASE版本搭建1.1 pom文件1.1.1 方式一1.1.2 方式二 1.2 启动类1.3 测试类 2. 引入Value乱码问题解决 【后端目录贴】 1. 2.3.7.RELEASE版本搭建 1.1 pom文件 1.1.1 方式一 <parent><groupId>org.springframework.boot</groupId><…...
React Native调用摄像头画面及拍照和保存图片到相册全流程
今天主要做了一个demo,功能很简单,就是调用手机摄像头画面,并且可以通过按钮控制拍照以及将图片保存到手机相册的功能,接下来我将从创建项目开始一步一步完成这个demo,各位只需要复制粘贴即可 创建React Native项目 npx react-native init yx_rnDemo --version 0.70.6 // 这里…...
Kubernetes基本部署概念
文章目录 命名空间(Namespaecs)查看命名空间查看带有命名空间对象下资源 文件存储持久卷(pv,Persistent Volumes)卷容量卷模式(volumeMode)访问模式(accessModes)回收策略…...
QT c++ 海康红外热像仪
//本文描述2通道海康通道红外热像仪预览和抓图 #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); userID-1; …...

OpenAI 的 GPTs 提示词泄露攻击与防护实战:防御卷(一)
前面的OpenAI DevDay活动上,GPTs技术的亮相引起了广泛关注。随着GPTs的创建权限开放给Plus用户,社区里迅速涌现了各种有趣的GPT应用,这些都是利用了Prompt提示词的灵活性。这不仅展示了技术的创新潜力,也让人们开始思考如何获取他…...

中科大计网学习记录笔记(十五):可靠数据传输的原理
前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是…...

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)
一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)࿰…...
力扣:93. 复原 IP 地址
回溯: 1.先定义一个接收的集合,之后再定义一个记录小数点的变量。之后编写回溯函数,终止条件为小数点的个数为3时,同时要判断最后一段的组合的值是否属于ip地址的范围。之后再用for循环来遍历ip地址的组合,先判断组合…...
利用序列化和反序列化实现深拷贝
利用序列化和反序列化可以实现对象的深拷贝,具体步骤如下: 将要深拷贝的对象序列化为字节流。从字节流中反序列化出一个新的对象,即完成了深拷贝。下面是一个示例代码: import java.io.*;class MyClass implements Serializable {private static final long serialVersion…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

多模态大语言模型arxiv论文略读(110)
CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题:CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者:Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...