当前位置: 首页 > news >正文

[C++/Linux] UDP编程

一. UDP函数

     UDP(用户数据报协议,User Datagram Protocol)是一种无连接的网络协议,用于在互联网上交换数据。它允许应用程序发送数据报给另一端的应用程序,但不保证数据报能成功到达,也就是说,它提供的是一种不可靠的服务。与TCP(传输控制协议)相比,UDP的优势在于它的简单性和低开销,使得它特别适合于那些对实时性要求高的应用,如视频会议和在线游戏。

在编程中,使用UDP进行数据通信涉及到一系列的函数调用。这些函数调用通常通过操作系统提供的网络接口与内核进行交互。下面是一些在UDP编程中常用的函数及其与内核的关系:

1. socket()

  • 用途:创建一个新的套接字(socket),它是进行网络通信的基础。
  • 与内核的关系:调用这个函数会让操作系统内核创建一个套接字数据结构,并返回一个引用这个结构的文件描述符(FD)。此后,应用程序通过这个文件描述符进行所有网络操作。

2. bind()

  • 用途:将套接字与一个特定的IP地址和端口号绑定。对于服务器端应用程序来说,这样做可以让它在特定的端口上监听来自客户端的连接或数据。
  • 与内核的关系:此函数将应用程序指定的IP地址和端口号信息注册到内核中,内核会用这些信息来识别到来的数据包是属于哪个应用程序的。

3. sendto()

  • 用途:用于向特定的目标地址发送数据。在UDP编程中,每次发送数据时都需要指定目的地的地址和端口号。
  • 与内核的关系:应用程序调用sendto()函数后,数据和目标地址信息被传递给内核,内核负责将数据打包成UDP数据报,并通过网络发送出去。

4. recvfrom()

  • 用途:用于接收来自任何地址的数据。应用程序可以通过这个函数获取发送方的地址信息。
  • 与内核的关系:当UDP数据报到达操作系统时,内核会根据数据报的目的端口号找到对应的套接字,并将数据放入该套接字的接收缓冲区。应用程序通过recvfrom()函数从这个缓冲区读取数据。

5. close()

  • 用途:关闭套接字,释放与之相关的资源。
  • 与内核的关系:调用close()函数后,应用程序通知内核它已经完成了对该套接字的使用,内核随后会清理与这个套接字相关的资源。

二. TCP编程与UDP编程的区别:

  1. 连接性

    • TCP:面向连接的协议,通信双方需要建立一个稳定的连接,然后才能进行数据传输。
    • UDP:无连接的协议,数据可以直接发送给接收方,不需要建立连接。
  2. 可靠性

    • TCP:提供可靠的数据传输,通过序列号、确认应答、重传机制等确保数据的可靠到达。
    • UDP:不保证数据可靠到达,可能会出现丢包,但UDP在丢包处理上更简单,不进行重传。
  3. 速度

    • TCP:由于建立连接和保证数据可靠,速度相对较慢。
    • UDP:因为没有连接建立和数据可靠性检查,速度相对较快。
  4. 数据流

    • TCP:保证数据的顺序,确保应用层接收到的数据顺序与发送顺序一致。
    • UDP:不保证数据顺序,数据可能会乱序到达。
  5. 使用场景

    • TCP:适用于对数据准确性要求较高的场景,如文件传输、邮件传输等。
    • UDP:适用于对速度要求较高,但可以容忍一定程度数据丢失的场景,如视频会议、在线游戏等。

三. UDP代码例子:

服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 8080
#define BUFFER_SIZE 1024// 函数声明
void error_handling(char *message);int main(int argc, char *argv[]) {int server_socket;struct sockaddr_in server_address, client_address;socklen_t client_address_size = sizeof(client_address);char message[BUFFER_SIZE];// 创建UDP套接字server_socket = socket(PF_INET, SOCK_DGRAM, 0);if (server_socket == -1) {error_handling("socket() error");}// 设置服务器地址结构memset(&server_address, 0, sizeof(server_address));server_address.sin_family = AF_INET;server_address.sin_addr.s_addr = htonl(INADDR_ANY);server_address.sin_port = htons(PORT);// 绑定套接字到端口if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) {error_handling("bind() error");}// 服务器主循环while (1) {// 接收客户端发送的数据int str_len = recvfrom(server_socket, message, BUFFER_SIZE, 0, (struct sockaddr *)&client_address, &client_address_size);if (str_len == -1) {error_handling("recvfrom() error");}// 打印接收到的消息printf("Received from client: %s\n", message);// 处理消息(这里简单地转换为大写)for (int i = 0; i < str_len; i++) {message[i] = toupper(message[i]);}// 发送处理后的消息回客户端sendto(server_socket, message, str_len, 0, (struct sockaddr *)&client_address, client_address_size);}// 关闭套接字close(server_socket);return 0;
}void error_handling(char *message) {fputs(message, stderr);fputc('\n', stderr);exit(1);
}

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 8080
#define BUFFER_SIZE 1024// 函数声明
void error_handling(char *message);int main(int argc, char *argv[]) {int client_socket;struct sockaddr_in server_address;char message[BUFFER_SIZE];int message_len;// 创建UDP套接字client_socket = socket(PF_INET, SOCK_DGRAM, 0);if (client_socket == -1) {error_handling("socket() error");}// 设置服务器地址结构memset(&server_address, 0, sizeof(server_address));server_address.sin_family = AF_INET;server_address.sin_addr.s_addr = inet_addr("127.0.0.1");server_address.sin_port = htons(PORT);// 循环读取用户输入并发送给服务器while (1) {printf("Input message(Q to quit): ");fgets(message, BUFFER_SIZE, stdin);// 检查是否退出if (!strcmp(message, "q\n") || !strcmp(message, "Q\n")) {break;}// 发送消息给服务器sendto(client_socket, message, strlen(message), 0, (struct sockaddr *)&server_address, sizeof(server_address));// 接收服务器响应message_len = recvfrom(client_socket, message, BUFFER_SIZE, 0, NULL, 0);if (message_len == -1) {error_handling("recvfrom() error");}// 打印服务器响应message[message_len] = 0;printf("Message from server: %s\n", message);}// 关闭套接字close(client_socket);return 0;
}void error_handling(char *message) {fputs(message, stderr);fputc('\n', stderr);exit(1);
}

相关文章:

[C++/Linux] UDP编程

一. UDP函数 UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;是一种无连接的网络协议&#xff0c;用于在互联网上交换数据。它允许应用程序发送数据报给另一端的应用程序&#xff0c;但不保证数据报能成功到达&#xff0c;也就是说&#xff0c;它…...

深入探索Linux的lsof命令

在Linux系统中&#xff0c;了解哪些文件被哪些进程打开对于系统管理和问题诊断是极其重要的。这正是lsof命令&#xff0c;即List Open Files&#xff0c;发挥其强大功能的场景。本文旨在详细介绍lsof的起源、底层原理、参数意义&#xff0c;常见用法&#xff0c;并详解其返回结…...

flowable 想改变正在运行的任务,实例版本为最新,需要改哪些表

在Flowable中&#xff0c;要改变正在运行的任务&#xff0c;你需要更新相关的流程定义&#xff0c;具体来说&#xff0c;可能涉及到以下几张表&#xff1a; ACT_RU_TASK&#xff08;运行时任务&#xff09;&#xff1a;这张表包含了当前正在运行的任务信息。你可能需要更新该表…...

统计各位数字都不同的数字个数 II

3032. 统计各位数字都不同的数字个数 II 给你两个 正整数 a 和 b &#xff0c;返回 闭区间 [a, b] 内各位数字都不同的数字个数。 示例 1&#xff1a; 输入&#xff1a;a 1, b 20 输出&#xff1a;19 解释&#xff1a;除 11 以外&#xff0c;区间 [1, 20] 内的所有数字的各…...

Taro框架中的H5 模板基本搭建

1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板...

gitea详细介绍

Gitea 是一个轻量级、易于安装的 Git 服务&#xff0c;提供了类似于 GitHub 的功能&#xff0c;如代码托管、问题追踪、团队合作等。它使用 Go 语言开发&#xff0c;可以在自己的服务器上进行部署&#xff0c;从而实现自托管的 Git 服务。Gitea 具有用户友好的界面&#xff0c;…...

应用性能分析系统SkyWalking的安装及使用详解

1. 前言 本文全面介绍了Skywalking的功能特点、安装步骤以及使用方法。首先,文章详细阐述了Skywalking作为一款开源的应用性能管理系统(APM)的核心功能,包括分布式追踪、服务网格观测分析、度量聚合和可视化一体化等。接着,文章提供了Skywalking的详细安装指南,包括环境…...

服务器远程桌面连接不上怎么办?

随着互联网的发展和远程办公的兴起&#xff0c;服务器远程桌面连接成为了许多企业和个人不可或缺的工具。偶尔我们可能会碰到服务器远程桌面连接不上的情况&#xff0c;这时候我们需要找到解决办法&#xff0c;确保高效地远程访问服务器。 天联组网——突破远程连接障碍 在我们…...

C++之STL的algorithm(8)之适配器(bind等)整理

C之STL的algorithm&#xff08;8&#xff09;之适配器&#xff08;bind等&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的适配器整理 C之STL的algorithm&…...

部分国企笔试总结

2024.3.30相城区某国企笔试 客观题&#xff0c;30分 类似考公行测题&#xff08;大部分&#xff09;部分计算机专业基础知识&#xff08;仅几题&#xff09; 主观题&#xff0c;70分 网络安全类一道C编程题&#xff1a;用户输入圆半径r&#xff0c;程序计算面积和周长并输出…...

《QT实用小工具·二十二》多种样式导航按钮控件

1、概述 源码放在文章末尾 该项目实现了多种样式的导航按钮控件 可设置文字的左侧、右侧、顶部、底部间隔。 可设置文字对齐方式。 可设置显示倒三角、倒三角边长、倒三角位置、倒三角颜色。 可设置显示图标、图标间隔、图标尺寸、正常状态图标、悬停状态图标、选中状态图标…...

不定长顺序表

一.不定长顺序表的结构: typedef struct DSQList{ int* elem;//动态内存的地址 int length;//有效数据的个数 int listsize;//总容量 }DSQList,*DPSQList; 很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下: 二…...

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …...

网格矢量如何计算莫兰指数

网格矢量如何计算莫兰指数 引言 遇到一个问题&#xff0c;计算矢量网格的莫兰指数。 概念解释 莫兰指数 莫兰指数&#xff08;Moran’s Index&#xff09;是一种空间自相关指标&#xff0c;用于衡量空间数据的相似性和聚集程度。它可以用来描述一个区域与其邻近区域之间的属…...

《containerd原理剖析与实战》大模型时代下如何学习云原生

大模型与云原生 近年来&#xff0c;大语言模型的热度可谓是愈发高涨&#xff0c;尤其是今年年初 Sora 的出现&#xff0c;更是让全球再次看到了AIGC 的巨大威力。 Sora 生成实例视频---几头巨大的长毛猛犸踏着积雪的草地而来 在当前大模型流行的时代下&#xff0c;云原生技术…...

【实用工具】使用飞书机器人监控工程日志

1.创建一个飞书群聊&#xff0c;设置-->群机器人-->添加机器人-->自定义机器人-->修改机器人名称-->添加 2.复制webhook地址 3.编写日志请求代码 import logging import requests import json import os from datetime import datetime import time import sub…...

NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程

这个游戏中的妮姬分四个企业&#xff0c;其中朝圣者这个派别的妮姬很少而且不在愿望单理&#xff0c;朝圣者的所有姐姐都很哇塞&#xff0c;红莲更是其中的大姐大。一般想抽朝圣者只能靠歪或者出限定卡池&#xff0c;举个栗子&#xff0c;我入坑的时候 朝圣者 神罚 是限定卡池&…...

【leetcode面试经典150题】2.移除元素(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

实现几何对象按照一定距离向外缓冲

1、首先&#xff0c;确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…...

现代深度学习模型和技术

Transformer模型的理解和应用 Transformer模型自2017年由Vaswani等人在论文《Attention is All You Need》中提出以来&#xff0c;已经彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的面貌。Transformer的核心是自注意力&#xff08;Self-Attention&#xff09;机制…...

毕业设计实战:基于SpringBoot的饮食分享平台设计与实现全攻略

毕业设计实战&#xff1a;基于SpringBoot的饮食分享平台设计与实现全攻略 在开发“饮食分享平台”这套毕设时&#xff0c;我曾因“菜谱信息与趣味答题数据脱节”踩过一个关键坑。初期设计时&#xff0c;我将“菜谱推荐”和“趣味答题”视为两个独立模块&#xff0c;导致用户在浏…...

Phi-4-mini-reasoning与IDEA集成开发:提升Java代码推理与注释生成效率

Phi-4-mini-reasoning与IDEA集成开发&#xff1a;提升Java代码推理与注释生成效率 1. 引言&#xff1a;当AI遇见Java开发 作为一名Java开发者&#xff0c;你是否经常遇到这样的困扰&#xff1a;接手一个复杂项目时&#xff0c;面对层层嵌套的代码逻辑感到无从下手&#xff1b…...

256K上下文颠覆智能编程:Qwen3-Coder重构全栈开发效率范式

256K上下文颠覆智能编程&#xff1a;Qwen3-Coder重构全栈开发效率范式 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-Coder-30B-A3B-Instruct 问题发现&#xff1a;传统AI编程助手的三大痛点 2025年Stac…...

实测分享:Claude+万象熔炉组合,抽象概念也能变成具体画面

实测分享&#xff1a;Claude万象熔炉组合&#xff0c;抽象概念也能变成具体画面 你有没有过这样的体验&#xff1f;脑子里突然冒出一个绝妙的画面&#xff0c;可能是昨晚梦里的一个片段&#xff0c;也可能是读到某段文字时脑海中浮现的场景。你想把它画下来&#xff0c;但拿起…...

ai辅助开发,让快马智能生成centos下openclaw安装与配置的疑难解决方案

在CentOS系统上安装和配置OpenClaw这类工具时&#xff0c;经常会遇到各种依赖冲突、环境配置问题&#xff0c;以及需要定制化爬取规则的情况。传统方式下&#xff0c;我们需要手动查阅文档、调试命令&#xff0c;甚至反复尝试不同版本的依赖包&#xff0c;过程相当耗时。而借助…...

手把手教你用Cloudflare免费RPC节点开发以太坊应用

从零构建以太坊DApp&#xff1a;Cloudflare免费RPC节点实战指南 当你在深夜调试智能合约时&#xff0c;是否曾被突然失效的RPC节点打断思路&#xff1f;作为以太坊开发者&#xff0c;稳定可靠的节点连接是开发流程中最基础却最容易被忽视的一环。Cloudflare提供的免费以太坊RPC…...

突破网盘限制的高效工具:解锁全速下载与无缝分享的实战指南

突破网盘限制的高效工具&#xff1a;解锁全速下载与无缝分享的实战指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…...

Qwen3-ForcedAligner-0.6B在字幕制作中的落地应用:SRT自动导出全流程

Qwen3-ForcedAligner-0.6B在字幕制作中的落地应用&#xff1a;SRT自动导出全流程 1. 引言&#xff1a;告别手动打轴&#xff0c;让字幕制作快10倍 如果你做过视频字幕&#xff0c;一定体会过手动打轴的痛苦。一集45分钟的视频&#xff0c;台词稿早就准备好了&#xff0c;但你…...

华为云AI开发认证HCCDA通关指南:从试题解析到实战应用

1. 华为云HCCDA认证&#xff1a;AI开发者的黄金敲门砖 最近两年&#xff0c;AI技术在各行各业的应用越来越广泛&#xff0c;很多开发者都在寻找能够系统学习AI开发的途径。华为云推出的HCCDA&#xff08;Huawei Cloud Certified Developer Associate&#xff09;认证&#xff0…...

Wan2.2-I2V-A14B镜像免配置:SSH直连后cd /workspace即可执行全部命令

Wan2.2-I2V-A14B镜像免配置&#xff1a;SSH直连后cd /workspace即可执行全部命令 1. 镜像概述与核心优势 Wan2.2-I2V-A14B私有部署镜像是一款专为文生视频模型定制的开箱即用解决方案。这个镜像最大的特点就是"免配置"——通过SSH连接后&#xff0c;只需进入/works…...