首页 > 其他分享 >异步服务器编写过程

异步服务器编写过程

时间:2024-10-16 14:50:21浏览次数:7  
标签:异步 io int memset 服务器 context 编写 using

boost::asio::io_context 的作用

boost::asio::io_context 是 Boost.Asio 库中的一个核心组件,
主要用于管理异步事件和任务的执行。
它在网络编程、并发编程和异步操作中发挥着重要作用。

主要作用

  1. 事件循环

    • io_context 提供了一个事件循环,可以调度和处理异步操作。当有事件发生时(例如,I/O 操作完成、定时器触发等),它会调用相应的回调函数。
  2. 异步操作管理

    • 它允许用户注册各种异步操作,如网络连接、读取/写入数据、定时器等,并在这些操作完成时自动调用相应的回调函数。
  3. 多线程支持

    • io_context 可以在多个线程中运行,允许并行处理多个事件。这使得应用程序能够充分利用多核处理器。
  4. 任务调度

    • 除了处理 I/O 操作,io_context 还可以用来调度其他类型的任务,例如定时任务或延迟任务。
  5. 资源管理

    • 它负责管理与异步操作相关的资源,确保在不再需要时能够正确释放资源。

使用示例

以下是一个简单的使用 io_context 的示例:

cpp
#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio;

void print() {
    std::cout << "Hello, World!" << std::endl;
}

int main() {
    io_context io;

    // 创建一个定时器
    deadline_timer timer(io, boost::posix_time::seconds(5));
    
    // 设置定时器到期时的处理函数
    timer.async_wait([](const boost::system::error_code& /*e*/) {
        print();
    });

    io.run();  // 进入事件循环
    return 0;
}

在这个例子中,我们创建了一个定时器,设置它在 5 秒后触发,并通过 io_context 的事件循环来处理这项异步操作。

小结
总之,boost::asio::io_context 是构建高效、可扩展的异步应用程序的重要工具,特别是在网络和 I/O 操作的上下文中。它使得处理复杂的异步逻辑变得更加简洁和高效。

using作用

创建别名

简化代码:使用 using 可以避免每次使用 tcp 类型时都要写出完整的命名空间路径。例如,后续代码中可以直接使用 tcp,而不需要写作 boost::asio::ip::tcp。

结构体/类别名:

using 还可以用于定义类型别名,例如:
cpp
using MyInt = int;

使用 using 简化函数指针

cpp
#include <iostream>

// 使用 using 简化函数指针类型
using FunctionPointer = void(*)(int);

void myFunction(int x) {
    std::cout << "Value: " << x << std::endl;
}

int main() {
    FunctionPointer ptr = &myFunction; // 使用更简洁的定义
    ptr(42);
    return 0;
}

C++ memset用法

用法示例
1. 初始化数组
cpp
#include <iostream>
#include <cstring>

int main() {
    int arr[5];

    // 使用 memset 将数组所有元素初始化为 0
    memset(arr, 0, sizeof(arr));

    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " "; // 输出为 0 0 0 0 0
    }
    return 0;
}
2. 初始化结构体
cpp
#include <iostream>
#include <cstring>

struct MyStruct {
    int a;
    double b;
};

int main() {
    MyStruct s;

    // 使用 memset 将结构体所有成员初始化为 0
    memset(&s, 0, sizeof(s));

    std::cout << "a: " << s.a << ", b: " << s.b << std::endl; // 输出 a: 0, b: 0
    return 0;
}
3. 设置特定值
注意:memset 只适合设置字节值,因此它通常不适合于设置非字符类型的值。
例如,如果你想将整数数组的值设置为某个特定非零值,应该谨慎使用。

cpp
#include <iostream>
#include <cstring>

int main() {
    int arr[5];

    // 错误示范:使用 memset 将所有元素设置为 1 (实际上会把每个字节都设置为 1)
    memset(arr, 1, sizeof(arr));

    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " "; // 输出不确定的结果
    }
    return 0;
}

注意事项
数据类型:memset 按字节操作,不适合用于设置非字符类型的值(如整型、浮点型等)为非零值。
未初始化的内存:如果你对一个类或结构体使用 memset,请注意这可能会影响到包含虚函数或非平坦数据成员的对象,因为 memset 会直接操作内存,不会调用构造函数。

enum

class Session
{
private:
	enum {max_length=1024};
	char data[max_length];
};
在 C++ 中,enum 定义的都是整数常量,
即使它们被赋予了字符或其他类型的值。

使用字符值时,它们会被视为对应的 ASCII 整数值。
如果需要使用这些常量,您可以将它们转换回相应的字符类型。

size_t

  1. 定义
    类型:size_t 是一个无符号整型(unsigned integer),其确切的位数依赖于平台和编译器,通常为 16、32 或 64 位。
  2. 特点
    无符号:由于 size_t 是无符号类型,因此它不可以表示负数。这使得它非常适合用于表示内存大小、数组索引等总是非负的值。

跨平台性:size_t 的大小与系统架构(32-bit 或 64-bit)有关。在 32 位系统中,size_t 通常是 32 位;在 64 位系统中,它通常是 64 位。

标签:异步,io,int,memset,服务器,context,编写,using
From: https://www.cnblogs.com/qwer321/p/18468381

相关文章

  • Zabbix进阶实战!将告警推送到Syslog服务器详细教程
    需求场景:用户需要将zabbix产生的告警事件推送给rsyslog服务器,syslog服务器再对事件日志进行分析处理.环境配置信息服务器IP地址ZabbixServer192.168.200.195Rsyslog服务器192.168.200.128*Rsyslog服务器防火墙需要放通UDP/514端口推送脚本需要修......
  • 永久白嫖AWS云服务器,验证、注册指南【2024.10.16亲测可用】
    背景不知道你想不想拥有一台属于自己的云服务器呢,拥有一台自己的云服务器可以建站,可以在上面搭建个人博客,今天我就来教大家如何申请亚马逊AWS免费云服务器,这个云服务器可以长达12个月的免费。而且到期后可以继续换个账号继续白嫖。(不过呢在注册的时候是需要信用卡的,实测国......
  • 利用Socket,编写一个聊天程序
    实验1:利用Socket,编写一个聊天程序实验要求要求1.给出聊天协议的完整说明;2.利用C或C++语言,使用基本的Socket函数完成程序。不允许使用CSocket等封装后的类编写程序;3.使用流式套接字、采用多线程(或多进程)方式完成程序;4.程序应该有基本的对话界面,但可以不是图形......
  • 腾讯云服务器选配方案及官方限时优惠领取
    云服务器选配的时候,一定要先领取官方限时折扣优惠:腾讯云服务器限时活动折扣券领取链接腾讯云服务器的选配标准主要基于以下几个关键方面:一、计算需求CPU选择:CPU是云服务器的核心部件,直接影响服务器的计算性能。腾讯云提供了多种型号的CPU,如IntelXeon和AMDEPYC等。对于高......
  • Django之本地代码修改,如何上传到服务器
    1.首先将本地代码上传到自己的Gitee1.1下载软件1.2上传代码找到自己项目所在的文件夹,然后右键,找到GitBash,运行,注意一定在自己的项目目录下运行。1.3输入代码 gitadd. gitcommit-m'****' gitpushoriginmaster成功将本地刚修改的代码上传到Gitee中......
  • 第九章习题3-编写一个函数print,打印一个学生的成绩数组,该数组有5个学生的数据记录,每个
     ......
  • 超微服务器破ipmi密
     在系统里安装ipmitool工具下载地址:https://github.com/ipmitool/ipmitool/releases/tag/IPMITOOL_1_8_18安装:#tarzxfvipmitool-1.8.18.tar.gz#cdipmitool-1.8.18#./configure#make&&makeinstall破:#impitooluserlist 1(查看用户情况)#ipmitoolusersetpas......
  • 单纯自我记录一下 如何用服务器跑自己的代码 防止忘记
    刚开始接触租服务器跑代码,之前的是LapTop4060显存不够用,随记下来防止忘记。第一步:找到自己心意的服务器网站(蓝耘)https://cloud.lanyun.net/#/registerPage?promoterCode=点击控制台——>容器实例——>租用新实例——>选择自己心仪的服务器,建议选择剩余数量多的,免得你关机后下......
  • 基于XP架设Web和FTP服务器基于XP架设Web和FTP服务器真没想到
    网络的迅速发展使宽带走入寻常百姓家,广大网络爱好者也勇于尝试,在自己的爱机上建设自己的网站,那么选择什么系统呢?Win2000漏洞百出,Win2003又专门为服务器设计,没有太适合普通的家用,相反WinXP是微软继Win98后最受欢迎的操作系统,今天我就介绍1下,在XP环境中利用IIS架构自己的网站。......
  • CATIA软件许可服务器IP地址更改
    在工程设计领域,CATIA软件是众多企业的首选工具。然而,当许可服务器的IP地址需要更改时,这可能会对整个设计团队的工作流程产生显著影响。本文将详细分析这些影响,并提供具体的应对策略,以确保平稳过渡并最小化业务中断。一、具体影响连接中断:当许可服务器的IP地址更改后,所有CAT......