【Windows】【C++】【Udp】 udp通信协议详解和示例

在 Windows 平台上,使用 C++ 实现的 UDP 通信服务器和客户端示例代码稍有不同,因为 Windows 使用 Winsock API 进行网络编程。下面是一个简单的 UDP 服务器和客户端的实现示例,包括详细的代码和说明。

UDP 服务器代码示例(Windows)

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库#define PORT 8080
#define BUFFER_SIZE 1024int main() {// 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "Winsock initialization failed" << std::endl;return -1;}// 创建套接字SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockfd == INVALID_SOCKET) {std::cerr << "Socket creation failed" << std::endl;WSACleanup();return -1;}// 设置服务器地址结构struct sockaddr_in serverAddr, clientAddr;memset(&serverAddr, 0, sizeof(serverAddr));memset(&clientAddr, 0, sizeof(clientAddr));serverAddr.sin_family = AF_INET; // IPv4serverAddr.sin_addr.s_addr = INADDR_ANY; // 任意地址serverAddr.sin_port = htons(PORT); // 端口号// 绑定套接字到地址if (bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "Bind failed" << std::endl;closesocket(sockfd);WSACleanup();return -1;}std::cout << "UDP Server is up and listening on port " << PORT << std::endl;while (true) {char buffer[BUFFER_SIZE];int clientAddrLen = sizeof(clientAddr);int n = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&clientAddr, &clientAddrLen);if (n == SOCKET_ERROR) {std::cerr << "recvfrom failed" << std::endl;continue;}buffer[n] = '\0'; // 添加字符串结束符std::cout << "Received: " << buffer << std::endl;// 发送回应给客户端sendto(sockfd, buffer, n, 0, (struct sockaddr*)&clientAddr, clientAddrLen);std::cout << "Echoed back to client" << std::endl;}closesocket(sockfd);WSACleanup();return 0;
}

UDP 客户端代码示例(Windows)

#include <iostream>#include <string>#include <winsock2.h>
#include <ws2tcpip.h>#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库#define PORT 8080
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024int main()
{
// 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "Winsock initialization failed" << std::endl;return -1;}// 创建套接字SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockfd == INVALID_SOCKET) {std::cerr << "Socket creation failed" << std::endl;WSACleanup();return -1;}// 设置服务器地址结构struct sockaddr_in serverAddr;memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET; // IPv4serverAddr.sin_port = htons(PORT); // 端口号inet_pton(AF_INET, SERVER_IP, &serverAddr.sin_addr); // 服务器 IPwhile (true) {std::string message;std::cout << "Enter message: ";std::getline(std::cin, message);// 发送消息到服务器sendto(sockfd, message.c_str(), message.size(), 0, (const struct sockaddr*)&serverAddr, sizeof(serverAddr));// 接收服务器的回应char buffer[BUFFER_SIZE];int serverAddrLen = sizeof(serverAddr);int n = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&serverAddr, &serverAddrLen);if (n == SOCKET_ERROR) {std::cerr << "recvfrom failed" << std::endl;continue;}buffer[n] = '\0'; // 添加字符串结束符std::cout << "Server: " << buffer << std::endl;}closesocket(sockfd);WSACleanup();return 0;
}

代码详解

  1. 头文件包含:

    • winsock2.h 和 ws2tcpip.h 是 Windows 中网络编程需要的头文件。
    • 使用 #pragma comment(lib, "ws2_32.lib") 语句链接 Winsock 库。
  2. 初始化 Winsock:

    • 在进行任何其他网络操作之前,我们需要调用 WSAStartup() 来初始化 Winsock 库。
  3. 套接字创建:

    • 使用 socket() 函数创建一个 UDP 套接字,返回一个套接字描述符。
  4. 地址结构配置:

    • 服务器地址配置 INADDR_ANY 表示监听来自任意 IP 的数据,端口号固定为 8080。
    • 客户端设定目标服务器的 IP 地址和端口号。
  5. 绑定套接字:

    • 使用 bind() 函数将创建的套接字与指定地址和端口绑定。
  6. 数据接收和发送:

    • 服务器使用 recvfrom() 函数接收数据,并使用 sendto() 函数将数据回传给客户端。
    • 客户端发送数据后,使用 recvfrom() 接收服务器的回应。
  7. 清理资源:

    • 最后使用 closesocket() 关闭套接字,调用 WSACleanup() 清理 Winsock 资源。

编译和运行

要编译这些代码,通常在 Windows 上使用 Visual Studio 或者在命令行中使用以下命令(假设使用 g++ 编译器):

g++ udp_server.cpp -o udp_server -lws2_32
g++ udp_client.cpp -o udp_client -lws2_32
./udp_server
./udp_client

测试

  1. 启动 UDP 服务器,它会开始监听来自客户端的消息。
  2. 之后启动 UDP 客户端,输入消息并按下回车键,消息会发送到服务器,并收到服务器返回的回显信息。

以上是一个简单的 Windows 平台下的 UDP 通信的实现,希望对你有所帮助。如果你有进一步的问题,请随时提问!

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

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

相关文章

Mybatis分页查询主从表

先主查询&#xff0c;再关联子查询&#xff0c;不影响分页效果&#xff0c;否则子查询也会参与分页。 <resultMap id"Hdr" type"com.Hdr"><id column"crh_id" property"id" javaType"int"/><collection prop…

计算机网络 第1章 概述

文章目录 计算机网络概念计算机网络的组成计算机网络的功能三种数据交换技术电路交换&#xff08;Circuit Switching&#xff09;报文交换&#xff08;message&#xff09;分组交换 三种交换方式性能对比计算机网络的分类计算机网络的性能指标性能指标1&#xff1a;速率性能指标…

【优化】Nginx 配置页面请求不走缓存 浏览器页面禁用缓存

【优化】Nginx 配置页面请求不走缓存 禁用缓存 目录 【优化】Nginx 配置页面请求不走缓存 禁用缓存 对所有请求禁用缓存 对特定location禁用缓存 注意事项 全局禁用缓存 要配置Nginx使其不缓存内容&#xff0c;通常是指禁止浏览器缓存响应的内容&#xff0c;或者是在代理…

单片机-串口通信(二)

目录 一、串口概念 1.相关概念&#xff1a; 按数据传输方式分类&#xff1a; 按时钟分类 二、STM32F103ZET6中串口 USART特性&#xff1a; NRZ数据格式&#xff1a; 三、配置串口通信 查看硬件原理图 软件配置流程 USART相关的寄存器 新建my_usart1.c和my_usart1.h …

将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法

将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法 目标效果示范 我们以百度首页为例&#xff0c;普通模式启动的页面通常会显示地址栏&#xff0c;如下图所示&#xff1a; 而本文要实现的效果是隐去地址栏和书签栏&#xff08;如果有的话&#xff09;&#xff0c;无…

【conda】Conda 环境迁移指南:如何更改 envs_dirs 和 pkgs_dirs 以及跨盘迁移

目录 迁移概述一、conda 配置文件1.1 安装 Conda 后的默认目录设置1.2 查看当前 .condarc 配置 二、更改 Conda 的 envs_dirs 和 pkgs_dirs 设置2.1 使用 conda config 命令Windows 和 Linux 系统 2.2 手动编辑 .condarc 文件Windows 系统Linux 系统 2.3 验证设置 三、迁移 Con…

JDBC |封装JDBCUtils|PreparedStatement|事务|批处理|数据库连接池| Blob类型数据的读写|Apache—DBUtils简介

一.概述 在Java中&#xff0c;数据库存取技术可分为如下几类&#xff1a; JDBC直接访问数据库JDO技术&#xff08;Java Data Object&#xff09;第三方O/R工具&#xff0c;如Hibernate, Mybatis 等 JDBC是java访问数据库的基石&#xff0c;JDO, Hibernate等只是更好的封装了J…

交流耦合同相放大电路设计

1 简介 该电路在单电源供电时&#xff0c;可放大交流信号&#xff0c;并可对输出信号进行电平抬升&#xff0c;以使其集中于电源电压信号的二分之一处。 2 设计目标 2.1 输入 2.2 输出 2.3 电源 2.4 截止频率下限&#xff08;&#xff09; 2.5 截止频率上限&#xff08;&…

elementUI根据列表id进行列合并@莫成尘

本文章提供了elementUI根据列表id进行列合并的demo&#xff0c;效果如图&#xff08;可直接复制代码粘贴&#xff09; <template><div id"app"><el-table border :data"tableList" style"width: 100%" :span-method"objectS…

docker python 3.11 容器报错

1. OSError: libc.so.1: cannot open shared object file: No such file or directory 解决办法 Dockerfile文件中增加如下命令执行安装 RUN apt install libc-dev 2. ImportError: libGL.so.1: cannot open shared object file: No such file or directory 解决办法 Dock…

sqlite3的db.serialize方法:确保数据库操作串行化的利器

在Node.js中&#xff0c;sqlite3是一个广受欢迎的轻量级数据库库&#xff0c;它提供了一个简洁的API来与SQLite数据库进行交互。在进行数据库操作时&#xff0c;为了确保操作的串行化执行&#xff0c;避免并发问题&#xff0c;sqlite3提供了db.serialize方法。本文将深入解析db…

物联网之硬件元器件基础知识介绍、集成电路、电阻器、电容器、电感器、二极管、三极管、晶体管、连接器、传感器、开关、电源

MENU 前言电子元件采购网址三极管持续更新中 前言 序言 硬件元器件是电子设备和系统的基本构成部分&#xff0c;它们在电子产品的设计、制造和功能实现中起着至关重要的作用。 电阻器(Resistor) 功能&#xff1a;电阻器用于限制电流流过电路的流动&#xff0c;并分配电压。它们…

聊一下软件测试的组织与管理

目录 1&#xff0e;测试的过程及组织 (1)首先&#xff0c;测试人员要仔细阅读有关资料。 (2)为了保证测试的质量。 (3)代码会审 (4)单元测试 (5)集成测试 (6)验收测试 2&#xff0e;测试方法的应用 3&#xff0e;测试的人员组织 (1)软件的设计和实现都是基于需求分…

ios私钥证书(p12)导入失败,Windows OpenSSl 1.1.1 下载

ios私钥证书(p12)导入失败 如果你用的OpenSSL版本是v3那么恭喜你V3必然报这个错&#xff0c;解决办法将OpenSSL 3降低成 v1。 Windows OpenSSl 1.1.1 下载 阿里云网盘下载地址&#xff1a;OpenSSL V1

【数据结构】-----哈希

目录 一、哈希表概念 二、哈希函数 三、哈希冲突 Ⅰ、定义 Ⅱ、解决 ①闭散列--开放定址法 线性探测 二次线性探测 ②开散列--链地址法&#xff08;哈希桶&#xff09; 问题&#xff1a;哈希表何时扩容&#xff1f; 一、哈希表概念 哈希表又称散列表&#xff0c;它是一…

python网络爬虫(四)——实战练习

0.为什么要学习网络爬虫 深度学习一般过程:   收集数据&#xff0c;尤其是有标签、高质量的数据是一件昂贵的工作。   爬虫的过程&#xff0c;就是模仿浏览器的行为&#xff0c;往目标站点发送请求&#xff0c;接收服务器的响应数据&#xff0c;提取需要的信息&#xff0c…

【408DS算法题】034进阶-22年真题_判断顺序存储二叉树是否是BST

Index 真题题目分析实现总结 真题题目 已知非空二叉树T的结点值均为正整数&#xff0c;采用顺序存储方式保存&#xff0c;数据结构定义如下: typedef struct { // MAX_STZE为已定义常量int SqBiTNode[MAX_SIZE]; // 保存二叉树结点值的数组int ElemNum; …

java 常用并发队列- DelayQueue

1. 什么是 DelayQueue&#xff1f; DelayQueue 是一个支持 延迟获取元素 的阻塞队列&#xff0c;它的元素必须实现 java.util.concurrent.Delayed 接口&#xff0c;该接口要求元素定义一个 getDelay(TimeUnit unit) 方法&#xff0c;用来指定元素何时可以从队列中取出。DelayQ…

Python简易IDE工作界面制作

、 休闲一下&#xff0c;学习编程还是要学习一些界面编程&#xff0c;能够根据需要制作图形操作界面&#xff0c;这样我们开发的程序才能方便操作和使用&#xff0c;同时获得更友好的人机交互体验。下面是一个用PyQt5制作的简易界面&#xff0c;供大学参考。如下图所示&a…

【淘宝采集项目经验分享】商品评论采集 |商品详情采集 |关键词搜索商品信息采集

商品评论采集 1、输入商品ID 2、筛选要抓取评论类型 3、填写要抓取的页数 4、立刻提交-启动测试 5、等爬虫结束后就可以到“爬取结果”里面下载数据 商品详情采集 1、输入商品ID 2、立刻提交-启动爬虫 3、等爬虫结束后就可以到“爬取结果”里面下载数据 taobao.item_…