C++ 将不透明指针包装在共享\u ptr中
我正在尝试使用winsock2实现一个简单的TCP服务器应用程序。为此,我有一个接受连接的类(C++ 将不透明指针包装在共享\u ptr中,c++,std,shared-ptr,winsock2,C++,Std,Shared Ptr,Winsock2,我正在尝试使用winsock2实现一个简单的TCP服务器应用程序。为此,我有一个接受连接的类(TcpServer)和一个处理连接的类(TcpListener)。为此,这些对象需要共享SOCKET,whis被定义为UINT\u PTR。要安全地分享这一点,一个shared\u ptr似乎是最好的选择。不幸的是,shared\u ptr似乎应该包装一个struct或class,因此我的实现如下 struct SafeSocket_ { SOCKET Socket; SafeSocke
TcpServer
)和一个处理连接的类(TcpListener
)。为此,这些对象需要共享SOCKET
,whis被定义为UINT\u PTR
。要安全地分享这一点,一个shared\u ptr
似乎是最好的选择。不幸的是,shared\u ptr
似乎应该包装一个struct
或class
,因此我的实现如下
struct SafeSocket_
{
SOCKET Socket;
SafeSocket_(SOCKET socket)
: Socket(socket)
{}
~SafeSocket_()
{
closesocket(Socket);
std::cout << "destroyed SafeSocket_" << std::endl;
}
};
typedef std::shared_ptr<SafeSocket_> SafeSocket;
除了使用一个好的包装器库之外,一定有更好的方法来处理这个问题
<> >注意:我知道有一些很好的包装库,比如Assio,是Boost,但是我只是想弄清楚一些C++基础知识。 < P>基本的问题是<代码> uTuntPtR <代码>不是一个不透明指针。这是一个整数。如果是
typedef struct\uuu socket
,然后您可以编写std::shared_ptr
,插入一个自定义的deleter来调用close_socket,这样您就会笑了
有许多可能的方法:
- 使
成为包含共享ptr的类,并具有SafeSocket
成员函数。然后到处写socket
ClientSocket.socket()
- 如上所述,但给出套接字函数的
版本,并提供实际的套接字参数。因此,您可以编写SafeSocket
而不是ClientSocket.read(…)
read(ClientSocket.Socket,…)
- 作为typedef恢复到
,但将附加函数放在SafeSocket
中,这样您就可以编写SafeSocket\uu
ClientSocket->read(…)
我想我更喜欢中间的解决方案。基本问题是
UINT\u PTR
不是不透明的指针。这是一个整数。如果是typedef struct\uuu socket
,然后您可以编写std::shared_ptr
,插入一个自定义的deleter来调用close_socket,这样您就会笑了
有许多可能的方法:
- 使
成为包含共享ptr的类,并具有SafeSocket
成员函数。然后到处写socket
ClientSocket.socket()
- 如上所述,但给出套接字函数的
版本,并提供实际的套接字参数。因此,您可以编写SafeSocket
而不是ClientSocket.read(…)
read(ClientSocket.Socket,…)
- 作为typedef恢复到
,但将附加函数放在SafeSocket
中,这样您就可以编写SafeSocket\uu
ClientSocket->read(…)
我想我更喜欢中间的解决方案。天哪!经过三次编辑,几乎完全正确!可以使用自定义的
删除器
,该删除器将套接字
定义为指针
类型,即使它实际上不是指针。不确定是否可以使用std::shared_ptr
执行相同的操作,尽管它也支持自定义Deleter
,但可能支持自定义指针,也可能不支持自定义指针?我还没有深入研究它,我选择了中间的解决方案。雷米的建议很好,但我现在意识到将资源号包装在指针容器中会令人困惑。天哪!经过三次编辑,几乎完全正确!可以使用自定义的删除器
,该删除器将套接字
定义为指针
类型,即使它实际上不是指针。不确定是否可以使用std::shared_ptr
执行相同的操作,尽管它也支持自定义Deleter
,但可能支持自定义指针,也可能不支持自定义指针?我还没有深入研究它,我选择了中间的解决方案。Remy的建议会很好,但我现在意识到将资源号包装在指针容器中会令人困惑。
SafeSocket ClientSocket = SafeSocket(new SafeSocket_(accept(ListenSocket, NULL, NULL)));