UDP协议讲解
预备知识:
端口号port:
我们在正常网络通信时,实际上是进程在互相通信。
我们所有的网络通信的行为,本质上都是进程间通信。
对双方而言,1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号
ip地址用来标识互联网中唯一一台主机
端口号用来表示该指定的主机的进程的唯一性
所以ip+port={ip,port}互联网中唯一一个进程
{ip,port}我们把它叫做套接字,socket
如何理解端口号?uint16_t port
16位的数字,uint16_t port,用来标识主机的唯一的一个网络进程
为什么不直接用pid来表示网络中唯一一个进程
1.进程管理和网络管理进行解耦
2.port用来专门为网络通信
一个端口和一个进程进行关联?
一个进程可以和多个端口号关联,但是多个进程不能和一个端口号关联。
ip也可以对应多个端口号。
TCP和UDP

TCP协议:面向链接,面向字节流,可靠通信
UDP协议:面向数据报,无连接,不可靠通信
既然有了可靠通信,为什么又要设计不可靠通信
中性词,可靠通信,要得到保证就必须做更多的工作(复杂),不可靠通信,做更少的工作,很简单,丢包率也不会太高。他们之间只有不同没有好坏。
网络字节序列
在存储上我们有大端存储(大权值在低地址)和小端存储
也就是说不同机器的存储方式是不同的
我们在发数据,在内存中是以低地址到高地址发送,接收主机在内存中读取也是从低地址到高地址接收
网络规定达到网络的数据,都以大端发送,所有机器都知道数据是以大端发送的,所以小端机器就大端转化
到小端。因为主机的大小端是不一样的。

htonl:host to net int
因为port需要通过网络递送,所以得转成网络序列
socket:网路编程,socket是有很多类别的
1.unix socket :域间socket;同一台主机 的文件路径,在本主机进行通信
2.网络socket:ip+port:网络通信的文件
3.原始socket:编写一些网络工具
理论上以上三种类别都要有自己的一套接口
但是设计者只想用一套接口是一套通用的地址类型

Server服务器
创建套接字
![]()
return value;返回一个文件描述符

domain:网络通信的协议家族,也叫域
type:套接字的类型
protocol:tcp 或 udp

struct sockaddr_in local;
bzero(&lock,sizeof(local))
local.sin_family=AF_INET
local.sin_port=htons(_port)

local.sin_addr.s_addr=inet_addr(_ip)
![]()
完成下列功能
1.四字节ip 2.网络序列
创建了socket我们要把他绑定,将它与socket关联

sockfd:socket返回的文件描述符
addr:传入sockaddr_un 或者 sockaddr_in
addrlen:结构体长度
服务器永远不退出,在Start中注定是一个死循环、
服务器接收

返回的是实际字节,len的期望收到的字节,flags默认为0(阻塞收消息)
后两个参数为输入输出型参数:给我们客户端client的信息 ip port,以后发消息就发给这个客户端
服务器发送

#pragma once
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <unistd.h>#include <sys/types.h>
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>#include "nocopy.hpp"
#include "Log.hpp"
#include "Comm.hpp"using namespace std;
const uint16_t defaultport = 8888;
const int defaultsocketfd = -1;
const int buffsize = 1024;class Udpserver : public nocopy
{
public:Udpserver(const uint16_t port = defaultport): _port(port), _socketfd(defaultsocketfd){}void Init(){// socket_socketfd = socket(AF_INET, SOCK_DGRAM, 0);if (_socketfd < 0){lg.LogMessage(Fatal, "socket errr, %d : %s\n", errno, strerror(errno));cout << endl;exit(socketfderror);}lg.LogMessage(Info, "socketfd success \n");cout << endl;struct sockaddr_in local;bzero(&local, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY;// bindint n = ::bind(_socketfd, (struct sockaddr *)&local, sizeof(local));if (n < 0){lg.LogMessage(Fatal, "bind error,%d : %s\n", errno, strerror(errno));cout << endl;exit(binderror);}lg.LogMessage(Info, "bind success\n");cout << endl;}void Start(){for (;;){struct sockaddr_in peer;socklen_t peerlen = sizeof(peer);char rbuff[1024];ssize_t n = recvfrom(_socketfd, rbuff, sizeof(rbuff - 1), 0, (struct sockaddr *)&peer, &peerlen);rbuff[n] = '\0';cout << "recv info:" << rbuff << endl;// if (n < 0)// {// lg.LogMessage(Fatal, "recvfrom error,%d : %s\n", errno, strerror(errno));// }// rbuff[n]='\0';ssize_t sendn = sendto(_socketfd, rbuff, sizeof(buffsize), 0, (struct sockaddr *)&peer, peerlen);cout << "sendn success:" << rbuff << endl;if (n < 0){lg.LogMessage(Fatal, "sendto error,%d : %s\n", errno, strerror(errno));}}}~Udpserver() {}private:// string _ip;uint16_t _port;int _socketfd;
};
netstat: 查看网络连接 -anup
Client客户端
创建套接字
client需不需要绑定,一定需要,但不需要显示绑定,client向服务器第一次发送信息时会自动绑定

为什么?
server的port众所周知是不可以随意改变的,client的port是随机端口,这是由于启动客户端的进程是很多
![]()
的,
127.0.0.1:本地循环,通常用来网络cs的测试
我们想看到客户端的信息应该如何看到?

绑定云服务器地址失败?

云服务器的公网ip是虚拟的,无法直接bind,不推荐,更推荐本地任意ip的绑定方式
如何进行服务端的任意本地ip的绑定
IP=INADDR_ANY 实现动态绑定 0.0.0.0表示任意绑定
![]()
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <unistd.h>#include <sys/types.h>
#include <sys/socket.h>#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"
#include "Comm.hpp"
const int defaultsrecbuff = 1024;
using namespace std;
void Usage(char *argv)
{cout << "Usage:" << argv << "+ServerIp+ServerPort" << endl;
}
int main(int argc, char *argv[])
{if (argc < 3){Usage(argv[0]);cerr << "use client error" << endl;return Usage_Err;}// 创建套接字int socketfd = socket(AF_INET, SOCK_DGRAM, 0);// 填充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_port = htons(serverport);server.sin_addr.s_addr = inet_addr(serverip.c_str());while (true){string buff;cout << "#Please enter:";getline(cin, buff);int n = sendto(socketfd, buff.c_str(), buff.size(), 0,(const struct sockaddr *)&server, sizeof(server));if (n < 0){cerr << "send error" << errno << strerror(errno);break;}else{// 接收信息struct sockaddr_in peer;socklen_t peerlen = sizeof(peer);char recbuff[defaultsrecbuff];int m = recvfrom(socketfd, recbuff, sizeof(recbuff)-1, 0,(struct sockaddr *)&peer, &peerlen);if (m < 0){cerr << "rec error" << errno << strerror(errno);break;}else{recbuff[m]=0;cout << "#server say:" << recbuff << endl;}}}close(socketfd);
}
相关文章:
UDP协议讲解
预备知识: 端口号port: 我们在正常网络通信时,实际上是进程在互相通信。 我们所有的网络通信的行为,本质上都是进程间通信。 对双方而言,1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号 ip地址用来…...
交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...
CSDN Markdown 编辑器语法大全
Markdown 是一种轻量级标记语言,它以简洁、易读易写的特点,被广泛应用于技术文档、博客文章、笔记等领域。CSDN 的 Markdown 编辑器为用户提供了丰富的功能,让用户能够轻松地创建格式规范、内容丰富的文档。以下是一份详细的 CSDN Markdown 编…...
TCP/IP 协议【四次挥手】简要说明
四次挥手是为了确保数据的完整性和可靠性,解决的主要问题是双方在断开连接时,可能还有未完成传输的数据或者未被接收的数据。 具体来说,四次挥手解决的问题是: 第一次挥手(发送方向接收方发送FIN包)&#…...
第11篇:网络安全协议
目录 引言 11.1 安全套接字层(SSL)和传输层安全(TLS)协议 11.1.1 SSL/TLS 的工作原理 11.1.2 SSL/TLS 的应用场景 11.2 虚拟专用网(VPN)和 IP 安全协议(IPSec) 11.2.1 VPN 的工…...
ES-入门-javaApi-文档-新增-删除
新增指定索引的文档数据的代码如下: package com.atgulgu.es.test;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRe…...
【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b
【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b CogVideoX-2b 模型介绍发布时间模型测试生成的demo视频生成视频限制 运行环境安装运行模型下载开源协议参考 CogVideoX-2b 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 基础信息: 发布时间 2…...
【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例
在前面的文档中,介绍了如何在Unity工程中配置号MRTK和Pico SDK 【MR开发】在Pico设备上接入MRTK3(一)在Unity中导入MRTK3依赖【MR开发】在Pico设备上接入MRTK3(二)在Unity中配置Pico SDK 本文将介绍如何运行一个简单…...
C#中委托的应用与示例
委托 委托是指把事情托付给别人或别的机构办理。在C#语言中委托是一种特殊类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托是具有特定参数列表和返回类型的方法的引用的类型(不是引用对象,而是引用方法)。 可以委托将看作一个包含有序方法列表…...
算法: 模拟题目练习
文章目录 模拟替换所有的问号提莫攻击Z 字形变换外观数列数青蛙 总结 模拟 替换所有的问号 按照题目的要求写代码即可~ public String modifyString(String ss) {int n ss.length();if (n 1) {return "a";}char[] s ss.toCharArray();for (int i 0; i < n; i…...
软考中级科目怎么选?软考中级证书有什么用?
❇有计算机背景: 建议选择软件设计师或网络工程师。软件设计师更适合软件工程专业的同学报考,而网络工程师更适合网络工程专业的朋友(仅供参考)。 ❇没有计算机背景: 建议选择系统集成项目管理工程师作为入门科目。…...
HTTP 请求的请求体是什么
HTTP 请求的请求体(request body)是指在 HTTP 请求中除了请求行(request line)、请求头(headers)之外的实际数据部分。请求体通常包含用于向服务器发送数据的信息,这些信息可以是表单数据、JSON 对象、XML 文档或其他任何形式的数据。 http请求一般包含的内容 HTTP(超…...
助力语音技术发展,景联文科技提供语音数据采集服务
语音数据采集是语音识别技术、语音合成技术以及其他语音相关应用的重要基础。采集高质量的语音数据有助于提高语音识别的准确性,同时也能够促进语音技术的发展。 景联文科技作为专业的数据采集标注公司,支持语音数据采集。可通过手机、专业麦克风阵列、专…...
PyTorch搭建神经网络入门教程
PyTorch搭建神经网络入门教程 在机器学习和深度学习中,神经网络是最常用的模型之一,而 PyTorch 是一个强大的深度学习框架,适合快速开发与研究。在这篇文章中,我们将带你一步步搭建一个简单的神经网络,并介绍 PyTorch…...
你的电脑能不能安装windows 11,用这个软件检测下就知道了
为了应对Windows 11的推出,一款名为WhyNotWin11的创新型诊断软件应运而生。这个强大的工具不仅仅是一个简单的兼容性检测器,它更像是一位细心的数字医生,全方位评估您的计算机是否准备好迎接微软最新操作系统的挑战。 WhyNotWin11的功能远超…...
BF 算法
目录 BF算法 算法思路 完整代码 时间复杂度 查找所有起始位置 BF算法 BF算法:即暴力(Brute Force)算法,是一种模式匹配算法,将目标串 S 的第一个字符与模式串 T 的第一个字符进行匹配,若相等,则继续比较 S 的第二…...
SHOW-O——一款结合多模态理解和生成的单一Transformer
1.前言 大型语言模型 (LLM) 的重大进步激发了多模态大型语言模型 (MLLM) 的发展。早期的 MLLM 工作,例如 LLaVA、MiniGPT-4 和 InstructBLIP,展示了卓越的多模态理解能力。为了将 LLM 集成到多模态领域,这些研究探索了将预训练的模态特定编码…...
缓存框架JetCache源码解析-缓存变更通知机制
为什么需要缓存变更通知机制?如果我们使用的是本地缓存或者多级缓存(本地缓存远程缓存),当其中一个节点的本地缓存变更之后,为了保证缓存尽量的一致性,此时其他节点的本地缓存也需要去变更,这时…...
Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色
推荐:https://github.com/gyf-dev/ImmersionBar 在 Android 中要实现特定 Activity 内容顶部显示在状态栏底部以及封装方法修改状态栏颜色,可以通过以下步骤来完成: 一、让 Activity 内容显示在状态栏底部 在 AndroidManifest.xml 文件中,为特…...
用自己的数据集复现YOLOv5
yolov5已经出了很多版本了,这里我以目前最新的版本为例,先在官网下载源码:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 然后下载预训练模型,需要哪个就点击哪个模型就行&am…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
