c++ - 在 shared_ptr 中包装一个不透明的指针

标签 c++ std shared-ptr winsock2

我正在尝试使用 winsock2 实现一个简单的 TCP 服务器应用程序。为此,我有一个接受连接的类 (TcpServer) 和一个处理连接的类 (TcpListener)。为此这些对象需要共享SOCKET,定义为UINT_PTR。要安全地共享此内容,shared_ptr 似乎是可行的方法。不幸的是,shared_ptr 似乎应该包装一个 structclass,因此我的实现如下。

struct SafeSocket_
{
    SOCKET Socket;
    SafeSocket_(SOCKET socket)
        : Socket(socket)
    {}
    ~SafeSocket_()
    {
        closesocket(Socket);
        std::cout << "destroyed SafeSocket_" << std::endl;
    }
};
typedef std::shared_ptr<SafeSocket_> SafeSocket;

为了创建/接受一个新套接字,我使用了以下可怕的代码。更糟糕的是,我需要到处使用 ClientSocket->Socket

SafeSocket ClientSocket = SafeSocket(new SafeSocket_(accept(ListenSocket, NULL, NULL)));

除了使用一个很好的包装器库之外,必须有更好的方法来处理这个问题。

注意:我知道有很好的包装器库,例如来自 boost 的 asio,但我只是想了解一些 C++ 基础知识。

最佳答案

基本问题是UINT_PTR不是不透明指针。它是一个整数。如果是 typedef struct __socket SOCKET; , 那么你可以只写 std::shared_ptr<decltype(*SOCKET{})> ,坚持使用自定义删除器来调用 close_socket,你会大笑的。

有许多可能的方法:

  • 制作SafeSocket是一个包含 shared_ptr 且具有 socket 的类成员函数。然后你写ClientSocket.socket()到处都是。
  • 同上,但给出 SafeSocket套接字函数的版本,它提供了实际的套接字参数。所以而不是 read( ClientSocket.Socket, ...)你写ClientSocket.read(...) .
  • 回复到SafeSocket作为 typedef,但将附加函数放在 SafeSocket_ 中, 所以你写 ClientSocket->read(...)

我想我更喜欢中间的解决方案。

关于c++ - 在 shared_ptr 中包装一个不透明的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34251570/

相关文章:

c++ - 如何从 C++ 程序中打开 *.mht 文件?

C++:使用基类中的仅派生类变量

c++ - 如何将元组 <> 剥离回可变参数模板类型列表?

c++ - 'mem_fun' : is not a member of 'std'

c++ - boost shared_ptr 使用默认构造函数

c++ - 为什么在调用构造函数后会崩溃?我正在尝试将shared_ptr推回 vector

c++ - 使用 C++ 类显示 2 名员工之间输入最多的工资

c++ - 整数到字符串 : Without using stoi library

c++ - 通过引用传递自定义优先级队列

c++ - 如何访问派生的 std::shared_ptr?