【C++高并发服务器WebServer】-16:UDP简单实现

embedded/2025/2/14 4:06:40/

在这里插入图片描述

本文目录

  • 一、UDP通信流程
  • 二、UDP API
    • 2.1 sendto()
    • 2.2 recvfrom()

一、UDP通信流程

UDP通信的流程比较简单,下面这张图可以总结。
在这里插入图片描述

二、UDP API

2.1 sendto()

UDP相关头文件如下。

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

sockfd:一个有效的UDP套接字文件描述符,该套接字已经通过socket函数创建。
buf:指向要发送数据的缓冲区的指针。
len:要发送的数据的长度(字节数)。
flags:通常设置为0。也可以设置特定的标志来改变发送的行为,如MSG_DONTROUTE(绕过路由器)。
dest_addr:指向sockaddr结构的指针,该结构包含了目的地址信息。这个地址可以是IPv4或IPv6地址,具体取决于套接字的地址族(AF_INET或AF_INET6)。
addrlen:dest_addr结构的长度。这个长度应该与dest_addr指向的结构的大小相匹配。

成功时,sendto函数返回发送的字节数。出错时,返回-1,并设置errno以指示错误类型。

简单实现demo如下所示。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main() {int sockfd;struct sockaddr_in servaddr;char *message = "Hello, UDP server!";size_t len = strlen(message) + 1;ssize_t sent;// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置服务器地址和端口memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(12345); // 服务器端口号inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); // 服务器IP地址// 发送数据sent = sendto(sockfd, message, len, 0, (const struct sockaddr *)&servaddr, sizeof(servaddr));if (sent < 0) {perror("sendto failed");close(sockfd);exit(EXIT_FAILURE);}printf("Sent %ld bytes\n", (long)sent);// 关闭套接字close(sockfd);return 0;
}

2.2 recvfrom()

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

sockfd:一个有效的UDP套接字文件描述符,该套接字已经通过 socket 函数创建。
buf:指向用于存储接收数据的缓冲区的指针。
len:缓冲区的长度(字节数)。
flags:通常设置为0。也可以设置特定的标志来改变接收的行为,如 MSG_DONTWAIT(非阻塞接收)。
src_addr:指向 sockaddr 结构的指针,该结构用于存储发送方的地址信息。如果不需要地址信息,可以设置为NULL。
addrlen:指向变量的指针,该变量在调用前应初始化为 src_addr 结构的长度。调用成功后,该变量将被更新为实际接收到的地址的长度。

成功时,recvfrom 函数返回接收到的字节数。出错时,返回 -1,并设置 errno 以指示错误类型。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>#define BUF_SIZE 1024int main() {int sockfd;struct sockaddr_in servaddr, cliaddr;char buffer[BUF_SIZE];ssize_t received;socklen_t addrlen;// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置服务器地址和端口memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(12345); // 服务器端口号// 绑定套接字if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {perror("bind failed");close(sockfd);exit(EXIT_FAILURE);}// 接收数据addrlen = sizeof(cliaddr);received = recvfrom(sockfd, buffer, BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &addrlen);if (received < 0) {perror("recvfrom failed");close(sockfd);exit(EXIT_FAILURE);}printf("Received %ld bytes from %s:%d\n", (long)received,inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));// 关闭套接字close(sockfd);return 0;
}

http://www.ppmy.cn/embedded/162049.html

相关文章

一口气入门前端——HTML5入门

HTML5 1.1 HTML 介绍 HTML&#xff08;超文本标记语言&#xff09;是一种用于 Web 开发的标记语言&#xff0c;主要用来格式化和显示网页内容。可以将其视为一种文本文件&#xff0c;浏览器能够读取该文本文件并显示其中的内容。HTML支持多种元素&#xff08;也称作标签&…

DeepSeek Window本地私有化部署

前言 最近大火的国产AI大模型Deepseek大家应该都不陌生。除了在手机上安装APP或通过官网在线体验&#xff0c;其实我们完全可以在Windows电脑上进行本地部署&#xff0c;从而带来更加便捷的使用体验。 之前也提到过&#xff0c;本地部署AI模型有很多好处&#xff0c;比如&…

快速搭建 Elasticsearch 8 集群:零基础实战与升级注意事项

引言 随着大数据技术的飞速发展,Elasticsearch 成为许多应用场景中不可或缺的技术,它以其高效的全文搜索引擎和分布式存储架构在企业和个人项目中占据了一席之地。无论是在日志分析、实时搜索还是数据可视化中,Elasticsearch 都发挥着重要的作用。 在这篇文章中,我们将为…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

DeepSeek的出现会对百度有多大影响?

当DeepSeek与ChatGPT等大模型接管搜索入口&#xff0c;我们正见证百年一遇的信息革命。 01 传统搜索已死&#xff1f;AI助手正在重写游戏规则&#xff01; 当DeepSeek与ChatGPT等大模型接管搜索入口&#xff0c;我们正见证百年一遇的信息革命。 就像汽车淘汰马车、触屏终结按键…

基础连接已经关闭: 服务器关闭了本应保持活动状态的连接

您在进行 HTTP 请求时遇到“基础连接已经关闭: 服务器关闭了本应保持活动状态的连接”的错误&#xff0c;这通常与连接的保持活动&#xff08;Keep-Alive&#xff09;设置有关。以下是可能的原因和解决方法&#xff1a; 可能的原因&#xff1a; Keep-Alive 设置&#xff1a; 默…

数据库,数据表的增删改查操作

一.数据库的基本操作 &#xff08;1&#xff09;创建数据库 创建数据库就是在数据库系统中划分一块存储数据的空间&#xff0c;方便数据的分配、放置和管理。在MySQL中使用CREATE DATABASE命令创建数据库&#xff0c;语法格式如下: CREATE DATABASE数据库名称; 注&#xff1a…

DeepSeek 中的 GRPO 算法全面解析

摘要: 为特定任务调整大型语言模型 (LLM) 通常涉及通过使用人类反馈 (RLHF) 的强化学习对偏好数据进行微调。 虽然这些数据通常来自不同的标注者群体(例如,不同的文化背景、种族、公司团队等),但传统的 RLHF 方法采用“一刀切”的方法,即,它们不加区分地假设并优化一个单…