📝前言:

这篇文章我们来讲讲Linux——udpsocket

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


这里写目录标题

  • 一、预备理论知识
  • 二、重要接口
    • 1. socket
    • 2. 发 / 收信息
    • 3. sockaddr结构体
    • 4. bind
    • 5. 本地和网络的序列转换
  • 三、理解通信流程
  • 四,实操案例
    • 1. 单词翻译
    • 2. 简单群聊

一、预备理论知识

  • 计算机之间通过网络进行数据的传输(Socket通信),本质上是:两个计算机的两个进程间进行通信(进程是人的代表)
    • 两个网络进程间通信,看到的同一份资源是网路
    • 每个数据的发送和接收都必须经过套接字(socket)
      • 套接字负责维护网络通信的各种信息(如本地/远程地址、端口、协议类型等)。
      • 操作系统通过套接字来区分不同的网络连接和数据流。
      • 只有通过套接字,操作系统才能知道数据要发到哪里、从哪里收。
    • IP 用来标识是哪一台主机,Port端口号用来标识是主机上的哪一个进程
    • 一个端口号只能被一个进程占用,但是一个进程可以绑定多个端口号
  • 如何理解绑定?
    • 我们可以认为传输层有一张元素为:<端口号, 进程链表> 的hash
    • 当一个进程要和一个端口号绑定的时候,就会被加入到对应端口号的链表当中
    • 当收到网络传输过来的报文以后,就会提取(传输层有多种协议)其中的目的端口,然后去hash里面找到对应的进程(把数据交给对应的进程)

二、重要接口

1. socket

创建网络套接字

int socket(int domain, int type, int protocol);
  • domain:协议族,确定网络层使用的协议
    • 可以选:AF_INET(IPv4 协议),AF_INET6(IPv6 协议)…
  • type:套接字类型(常用的如下)
    • SOCK_DGRAM:无连接的 UDP 协议
    • SOCK_STREAM:面向连接的 TCP 协议
  • protocol:通常用 0 就行

TCP 是面向连接、可靠的字节流传输协议(需三次握手建立连接,数据无丢失、有序到达),而 UDP 是无连接、不可靠的数据包传输协议(无需建立连接,数据可能丢失、无序,但是 更简单,更快)

2. 发 / 收信息

向指定的IP和端口发消息

// ssize_t 是一个有符号整数类型
ssize_t sendto(int sockfd,          // 已绑定的套接字描述符const void *buf,     // 要发送数据的缓冲区size_t len,          // 数据长度 int flags,           // 发送标志const struct sockaddr *dest_addr,  // 目标地址结构指针socklen_t addrlen);  // 目标地址结构的长度

从指定 IP 和端口接收信息,将数据从内核层的Socket接收到用户层的缓冲区

ssize_t recvfrom(int sockfd,  // 从哪个套接字接收(远端传来的数据是先存到套接字缓冲区的)void *buf,   size_t len, int flags, struct sockaddr *src_addr,  // 接收到的数据来自哪个地址(对端地址)socklen_t *addrlen);

两个sockfd是一个东西,通过它向服务端发送数据,也通过它接收服务端返回的数据。

3. sockaddr结构体

struct sockaddr是一个C语言版本的“基类”(我们在传递参数的时候,要强转成:struct sockaddr*
对于
绑定IP和端口号就是填充对应不同协议的结构体,填充IPV4的struct sockaddr_in

  • sin_family:地址家族
  • sin_port :端口号
  • sin_addr.s_addr:IP(在sockaddr_in里面专门用一个sin_addr来管理IP,里面有本地主机以 uint32_t 存储的IPs_addr

4. bind

bind() 是一个核心系统调用,用于将套接字(socket)与特定的 IP 地址和端口号绑定,从而让程序能够在指定的地址和端口上接收网络请求。

int bind(int sockfd,  // 套接字描述符const struct sockaddr *addr,  // sockaddr 结构体socklen_t addrlen);  // addr 结构体的长度

5. 本地和网络的序列转换

关于大小端存储:
不同的机器,可能会用不同的方案(大小端)来存储IP,为了统一,网络规定,发到网络上的必须是大端的。所以需要转换。

  • 主机转网络
    • htons接口:将 16 位端口号 从主机字节序转换为网络字节序(大端序,内部会自行判断是否需要转换)
    • inet_pton:转IP,将字符串形式的IP地址转换成网络序列
  • 网络转主机(是上面的逆操作):
    • ntohs:转端口
    • inet_ntop:转 IP

示例:

// 处理 IPv4
struct in_addr ipv4_addr;
if (inet_pton(AF_INET, "192.168.1.1", &ipv4_addr) == 1) {// 转换成功
}// 处理 IPv6
struct in6_addr ipv6_addr;
if (inet_pton(AF_INET6, "2001:db8::1", &ipv6_addr) == 1) {// 转换成功
}

转换好的结果会被存在ipv6_addr这个结构体里面

三、理解通信流程

服务端工作流程

  • 创建套接字:服务端首先创建一个 UDP 套接字
  • 绑定地址:服务端将套接字绑定到特定的 IP 地址和端口
  • 接收数据:服务端使用 recvfrom() 函数从该套接字接收数据

客户端工作流程

  • 创建套接字:客户端创建自己的 UDP 套接字
  • 准备目标地址:客户端构造包含服务端 IP 地址和端口的 sockaddr_in 结构体
  • 发送数据:客户端调用 sendto() 函数,指定目标地址(通过绑定的 sockaddr_in),将数据发送到服务端

关键点

  • 服务端绑定:服务端必须绑定到固定地址,因为客户端要明确目标
    • 为了让服务端套接字监听主机的所有可用网络接口,我们可以绑定INADDR_ANY(假如服务器有多个网卡,多个IP,绑定INADDR_ANY后,客户端无论是通过哪个IP访问,服务器都能接收)
  • 客户端不需要绑定:在 UDP 通信中,客户端通常不需要显式绑定地址,第一次sendto时,操作系统会自动分配一个临时端口

套接字通信的工作原理
客户端和服务端的套接字是完全不同的实体。
当客户端调用 sendto() 时:

  1. 操作系统通过 sockfd 参数知道数据从哪个本地套接字发出
  2. 通过 dest_addr 参数知道数据要发送到哪个远程地址
  3. 操作系统自动为该套接字分配一个临时端口(如果尚未分配)
  4. 数据包中包含源 IP、源端口、目标 IP 和目标端口

当服务端接收到数据包时:

  1. 操作系统根据目标 IP 和端口,将数据包路由到绑定到该地址的套接字
  2. (对应目标IP和端口的) 服务端可以通过 recvfrom() 获取发送方的 IP 和端口信息
  3. 服务端可以使用这些信息,通过同一个或不同的套接字回复客户端

sendto函数里面,我们要传入要发送的信息的buffer,这个信息先被复制到套接字 sockfd 里面,然后(如果客户端没有绑定IP和端口,系统会自动分配)将信息和操作系统自动分配的源IP和端口,以及目标IP和端口(以及添加UDP头部…等等,也就是添加报头)一起打包成一个数据包然后再发送到 sockaddr_in 指向的目标地址

客户端应用程序    →    客户端套接字缓冲区    →    网络    →    服务端套接字缓冲区    →    服务端应用程序
(数据)            (数据复制)               (数据包)     (数据复制)               (数据)

四,实操案例

1. 单词翻译

代码有点太长了,如果有需要,可以访问我的Github
注意:

  • 公网IP其实没有配置到我们机器的IP上,无法被bind
  • 本地环回:要求c、s必须在一台机器上,表明我们是本地通信,client发送的数据,不会被推送到网络而是在OS内部,转一圈直接交给对应的服务器端(常用于网络代码的测试)

运行结果:

客户端
在这里插入图片描述
服务端:在这里插入图片描述

2. 简单群聊

获取代码 → 点击


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92650.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92650.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92650.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ面试精讲 Day 14:Federation插件与数据同步

【RabbitMQ面试精讲 Day 14】Federation插件与数据同步 开篇 欢迎来到"RabbitMQ面试精讲"系列第14天&#xff0c;今天我们将深入探讨RabbitMQ Federation插件与跨集群数据同步机制。在分布式系统架构中&#xff0c;如何实现消息队列集群间的数据同步是确保业务连续…

AI编程工具 | Trae介绍

描述需求就可以自动创建可运行的完整项目了&#xff0c;确实很强&#xff01; 终端中的报错信息都可以快速作为上下文输入&#xff0c;点击确认就可以自动修改&#xff0c;贼好使&#xff01; Trae 编程工具详细介绍 一、产品简介 Trae 是字节跳动于 2025 年 1 月 19 日推出的…

【第11话:感知算法基础3】目标检测:深度学习目标检测模型介绍入门及常用模型详解

深度学习目标检测模型介绍入门及常用模型详解 目标检测是计算机视觉的核心任务&#xff0c;需同时完成目标定位&#xff08;输出边界框坐标&#xff09;和目标分类&#xff08;识别类别&#xff09;。深度学习通过端到端训练显著提升了检测精度和效率&#xff0c;主要分为两类架…

稿定科技:多云架构下的 AI 存储挑战与 JuiceFS 实践

稿定科技&#xff08;gaoding.com&#xff09;是一家专注于为企业和个人提供视觉内容创新方案的科技公司&#xff0c;致力于打造全新的设计方式&#xff0c;帮助更多用户轻松掌控设计&#xff0c;创造价值。 随着 AI 技术的加速发展&#xff0c;数据存储和管理成为支撑公司创新…

徘徊识别场景误报率↓77%:陌讯动态时序建模方案实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计参考自《陌讯技术白皮书》&#xff0c;转载请注明来源。一、行业痛点&#xff1a;徘徊识别的现实困境在安防监控领域&#xff0c;徘徊行为识别是保障公共安全的关键技术&#xff08;如商场防盗窃、园区防闯入等场…

C# 通过第三方库INIFileParser管理INI配置文件

C# 通过第三方库INIFileParser管理INI配置文件目录前言一、添加动态库二、添加接口类代码总结前言 很多时候我们是直接调用系统的C库中的GetPrivateProfileString和WritePrivateProfileString接口来实现管理INI文件的&#xff0c;这个接口最久可以追溯到上个世纪80年代&#x…

政府数字化大屏系统 - Flask实现方案

下面我将设计一个基于Flask的政府数字化大屏系统&#xff0c;包含数据可视化、实时监控和统计分析功能&#xff0c;全套代码下载看底部。 设计思路 使用Flask作为后端框架提供数据接口 前端采用响应式设计&#xff0c;适配大屏展示 使用ECharts实现多种数据可视化 模拟实时…

2025年主流开源音视频播放项目深度解析

音视频技术作为多媒体领域的核心支撑&#xff0c;其开源生态在近年来呈现爆发式发展。从底层编解码引擎到跨平台播放器应用&#xff0c;开源项目已形成完整的技术栈&#xff0c;满足从个人娱乐到企业级流媒体服务的全场景需求。本文将深入剖析2025年最具影响力的五大开源音视频…

【C++详解】AVL树深度剖析与模拟实现(单旋、双旋、平衡因⼦更新、平衡检测)

文章目录一、AVL树的概念二、AVL树的实现AVL树的结构AVL树的插⼊AVL树插⼊⼀个值的⼤概过程平衡因⼦更新更新原则更新停⽌条件插入结点及更新平衡因子的代码实现旋转旋转的原则右单旋右单旋代码实现左单旋左单旋代码实现左右双旋左右双旋代码实现右左双旋代码实现判断旋转中序遍…

C++ 中的 enable_shared_from_this 详解

# C 中的 enable_shared_from_this 详解enable_shared_from_this 是 C 标准库中的一个模板类&#xff0c;用于解决在类的成员函数中需要获取指向自身的 shared_ptr 的问题。## 基本概念当一个对象由 shared_ptr 管理时&#xff0c;如果你想在对象的成员函数中获得一个指向自身的…

day11 - 浮动

1. 标签之间的空白问题 1.1. 问题重现 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Document</title><style>img {width: 100px;}</style> </head> <body><a…

MetaBit基金会加码投资图灵协议,深化去中心化金融与元宇宙生态合作

2025年7月15日 —— 新加坡MetaBit基金会宣布进一步加大对图灵协议&#xff08;Turing Protocol&#xff09;的战略投资&#xff0c;涵盖其去中心化交易所&#xff08;DEX&#xff09;、聚合交易平台&#xff08;CEX&#xff09;及公链生态的技术与资金支持。双方还将围绕元宇宙…

NWinfo(硬件信息检测工具)v1.4.20绿色免费版,U盘随走随检,结果即刻导出

[软件名称]: NWinfo(硬件信息检测工具)v1.4.20绿色免费版 [软件大小]: 1.4 MB [软件大小]: 夸克网盘 | 迅雷网盘 软件介绍 NWinfo 诞生于给老旧机器做体检的需求&#xff1a;一个单文件、零依赖的 Win32 小程序&#xff0c;却能像放大镜一样把机箱里的故事读出来。它不借助…

Numpy科学计算与数据分析:Numpy高效数据处理与优化

Numpy性能优化 学习目标 本课程将深入探讨如何利用Numpy库的特性来优化Python代码的性能&#xff0c;重点讲解向量化操作、避免Python循环等技术&#xff0c;帮助学员掌握高效的数据处理方法。 相关知识点 Numpy性能优化 学习内容 1 Numpy性能优化 1.1 Numpy数组与Pytho…

鸿蒙HarmonyOS中Axios网络库封装与文件上传功能实现

在开发鸿蒙HarmonyOS应用时&#xff0c;网络请求功能是必不可少的。axios是一个非常流行的基于Promise的HTTP客户端&#xff0c;适用于浏览器和Node.js环境。本文将介绍如何在鸿蒙HarmonyOS中封装axios库&#xff0c;使其能够支持文件上传&#xff0c;并提供额外的配置选项以满…

【AI】从零开始的文本分类模型实战:从数据到部署的全流程指南

目录 引言 一、项目背景与目标 二、环境准备 三、数据获取与探索 3.1 数据获取 3.2 数据探索 四、数据预处理 4.1 文本清洗 4.2 分词 4.3 标签编码 4.4 数据集划分 4.5 特征提取 五、模型构建与训练 5.1 逻辑回归模型 5.2 LSTM 模型 六、模型评估 6.1 逻辑回归…

Rust学习心得---特征对象和泛型区别

区别特性泛型&#xff08;静态分发&#xff09;特征对象&#xff08;动态分发&#xff09;决策时机编译时单态化&#xff08;生成具体类型的代码&#xff09;运行时通过vtable查找方法运行性能零运行时开销&#xff08;直接内联调用&#xff09;有额外开销&#xff08;指针跳转…

ESP32-menuconfig(2) -- Application manager

按顺序来说&#xff0c;第二篇本来应该是Security features&#xff0c;但是这块内容应该到小批量才用的到&#xff0c;而一些爱好者可能永远都不会修改这块&#xff0c;所以先看看更常用Application manager&#xff0c;这部分内容也比较少。 Application managerCONFIG_APP_C…

ArgoCD 与 GitOps:K8S 原生持续部署的实操指南

容器技术的爆发让 Kubernetes&#xff08;K8s&#xff09;成为了「云原生时代的操作系统」—— 它能高效编排成千上万的容器&#xff0c;解决弹性伸缩、资源调度等核心问题。但随着企业应用规模扩大&#xff0c;K8s 的「部署与管理」逐渐暴露新的挑战&#xff1a; 多环境&…

Day36--动态规划--1049. 最后一块石头的重量 II,494. 目标和,474. 一和零

Day36–动态规划–1049. 最后一块石头的重量 II&#xff0c;494. 目标和&#xff0c;474. 一和零 遇到难题&#xff0c;思考超过20分钟没有思路的&#xff0c;要跳过&#xff01;不然时间效率太低了。 **看题解同理&#xff0c;看20分钟看不懂的&#xff0c;也要跳过&#xff0…