gpt4 book ai didi

c++ - 如何使用 RAII 对套接字建模

转载 作者:行者123 更新时间:2023-11-30 02:04:40 25 4
gpt4 key购买 nike

我是 C++ 的新手(来自 C)。我从概念上理解 RAII 应该如何工作,但我无法将简单的套接字连接处理程序装入其中。

当前代码:

void accept_ev(event_handler::token &t, int listenfd)
{
int newfd = accept(listenfd, NULL, NULL);

if (newfd < 0)
throw api_server_accept_failed(*this, errno);

connections.insert(api_server_connection(newfd));
}

这显然不安全,因为 api_server_connection 构造函数可能会在将 fd 分配给其成员变量之前引发异常。

所以我的下一个想法是将接受移到构造函数中。问题是我真的希望 api_server_connection 不知道 fd 的来源。例如。如果我想在未来支持 inetd,它也可以作为 fd 0 传递到程序中。

那么我该怎么做。我应该为每种获取 fd 的方法使用不同的构造函数吗?我应该创建子类吗?另一种选择是使用 lambda 函数吗?

或者在这种情况下,我应该只捕获任何错误并关闭调用者中的 fd 吗?

最佳答案

暂时忽略套接字,您通常想要做的是将事情分为两个阶段。

在第一阶段,你做的事情可能会抛出,但如果它们抛出,你可以将系统恢复到正常状态(最好是什么都没有发生的状态)。

在第二阶段,你做的事情你可能无法撤消,但你确定永远不会扔掉。

要做到这一点,您需要保证什么可以/将抛出什么,并且(特别是)保证至少有一些相当具体的操作永远不会抛出(例如,交换两个项目)。

为此,您通常希望在 dtor 中恢复到正常状态,因此如果抛出异常,析构函数将自动清理。

不幸的是,关于您的具体代码/情况很难说更多,因为我们对您正在使用的类了解不够。

关于c++ - 如何使用 RAII 对套接字建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com