c++ asio: udp server and client demo

news/2024/5/18 16:37:14 标签: c++, udp, linux, 开发语言, asio

一、server 端

  1. 创建udp::socket,用于收发数据
    1)需要创建一个io_context对象,初始化socket对象
    2)创建一个udp::endpoint对象,指定协议版本(v4,v6)和端口号,初始化socket对象

  2. 执行收发动作,socket.receive_from和socket.send_to
    1)收发都需要一个asio::buffer缓存。
    2)receive_from可以获取到client的endpoint,也可以用这个对象给client发送数据(send_to)

二、client 端

  1. 创建一个udp::socket对象,用于收发数据。
  2. 使用socket对象收发数据,socket.send_to和receive_from
    1)创建一个udp::endpoint对象,指定server端地址、端口。
#include <iostream>
#include <thread>
#include <boost/asio.hpp>

using namespace std;
using namespace boost;
using namespace boost::asio;
using asio::ip::udp;

void server_func() {
    io_context io;

    udp::socket server_socket(io, udp::endpoint(udp::v4(), 22333));

    int count = 1;
    while(true) {
        char buf[128] = {0};
        udp::endpoint client_endpoint;
        server_socket.receive_from(asio::buffer(buf), client_endpoint);

        printf("server -> [%d]: %s\n", count++, buf);
        cout << "server -> client info: " << client_endpoint.address() << ":" << client_endpoint.port() << endl;

        server_socket.send_to(asio::buffer("received from server"), client_endpoint);
    }
}

void client_func() {
    io_context io;
    udp::socket client_socket(io, udp::v4());

    udp::endpoint server_endpoint(ip::address::from_string("127.0.0.1"), 22333);

    while(true) {
        char buf[128] = {0};
        cout << "client -> input:\n";
        cin >> buf;

        client_socket.send_to(asio::buffer(buf), server_endpoint);

//        cout << "client -> get feedback from server: " << server_endpoint.address() << ":" << server_endpoint.port() << endl;
//        bzero(buf, 128);
        client_socket.receive_from(asio::buffer(buf), server_endpoint);
//        cout << "client -> " << buf << endl;
    }
}

int main() {
    jthread server(server_func);
    cout << "start server\n";

    jthread client(client_func);
    cout << "start client\n";

    return 0;
}

http://www.niftyadmin.cn/n/5309370.html

相关文章

新世纪研究生公共英语教材 听说

新世纪研究生公共英语教材 听说 Lesson One MusicLesson Two HolidaysLesson Three EconomyLesson Four EducationLesson Five Life on CampusLesson Six AnimalsLesson Seven HealthLesson Eight YouthLesson Nine FoodsLesson Ten Introducing Foreign UniversitiesLesson El…

【基础篇】十二、引用计数法 可达性分析算法

文章目录 1、Garbage Collection2、方法区的回收3、堆对象回收4、引用计数法5、可达性分析算法6、查看GC Root对象 1、Garbage Collection C/C&#xff0c;无自动回收机制&#xff0c;对象不用时需要手动释放&#xff0c;否则积累导致内存泄漏&#xff1a; Java、C#、Python、…

Android AAudio

文章目录 基本概念启用流程基本流程HAL层对接数据流计时模型调试 基本概念 AAudio 是 Android 8.0 版本中引入的一种音频 API。 AAudio 提供了一个低延迟数据路径。在 EXCLUSIVE 模式下&#xff0c;使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区…

专为Mac用户设计的思维导图软件MindNode 2023 for Mac助您激发创意!

在现代快节奏的生活中&#xff0c;我们经常需要整理思绪、规划项目、记录灵感。而思维导图作为一种高效的思维工具&#xff0c;能够帮助我们更好地整理和展现思维。现在&#xff0c;我们介绍一款强大而直观的思维导图软件——MindNode 2023 for Mac&#xff0c;助您拓展思维边界…

编程天赋和努力哪个更重要?

编程天赋和努力在编程中都非常重要&#xff0c;但它们的侧重点不同。 编程天赋通常指的是与生俱来的、在逻辑思维、抽象思维、创造力等方面的能力&#xff0c;这些能力可以帮助程序员更快地理解问题、更高效地设计和实现解决方案。天赋的确可以帮助程序员更容易地入门和更快地掌…

如何向嵌入式设备中添加tcpdump工具

说明&#xff1a;tcpdump是一个在网络设备调试中一个非常重要的工具&#xff0c;它并不像hexdump等工具集成在busybox里面&#xff0c;也不像其他的软件一样只需要依赖linux标准的库就可以实现&#xff0c;它需要pcap相关的库和加密的相关库。 本文主要是基于realtek 83系列的…

python线程池提交任务

1. 线程池参数设置 CPU数量&#xff1a;N线程池的核心线程数量 IO密集型的话&#xff0c;一般设置为 2 * N 1&#xff1b; CPU密集型的话&#xff0c;一般设置为 N 1 或者 使用进程池。线程池的最大任务队列长度 &#xff08;线程池的核心线程数 / 单个任务的执行时间&#…

遗传算法总结(迭代版本2:附带MATLAB例题代码)

目录 基本概念&#xff1a; 具体例子 1.我们先对图像进行抽象化&#xff1a; 2.我们将得到的六串数字进行扁平化处理&#xff1a; 3.解释即后续操作​编辑 基本步骤&#xff1a; 总结 例题1&#xff1a; 例题2&#xff1a; 基本概念&#xff1a; 染色体&#xff08;Ch…