当前位置: 首页 > 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;机制…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...