【问题标题】:Can't use Poco TCPServer and TCPServerConnectionFactory不能使用 Poco TCPServer 和 TCPServerConnectionFactory
【发布时间】:2014-08-13 12:52:29
【问题描述】:

我在活动中使用 TCPServer。 为了简化我的设计,我将我的活动从 TCPServerConnectionFactory 设为 ihnerit。 这样,我的活动就实现了 CreateConnection() 方法。

为了创建我的 TCPServer 我做了:

Poco::Net::TCPServer(this, serverSocket);

不幸的是,当我的 TCPServer 被破坏时,它也破坏了我在参数中给出的(this)。所以它调用了我的活动的 dtor,这真的很烦人。

深入查看 Poco 代码,我看到 TCPServer 创建了一个 Poco::shared_Ptr of (this),当这个 Shared_Ptr 被销毁时,它删除了 shared_ptr 的内容。

如何在 TCPServer 生命周期结束时将 (this) 传递给 TCPServer 而不会被破坏?

【问题讨论】:

    标签: c++ shared-ptr poco-libraries


    【解决方案1】:

    您必须将堆上分配的连接工厂传递给 TCPServer。例子见TimeServer例子:

    class TimeServerConnection: public TCPServerConnection
    {
      //...
    };
    
    // ...
    
    class TimeServerConnectionFactory: public TCPServerConnectionFactory
    {
      // ...
      TCPServerConnection* createConnection(const StreamSocket& socket)
      {
        return new TimeServerConnection(socket, _format);
      }
      // ...
    };
    
    // set-up a server socket
    ServerSocket svs(port);
    // retain the handle to shared ptr for later use
    TCPServerConnectionFactory::Ptr pTSCF = new TimeServerConnectionFactory(format);
    // set-up a TCPServer instance
    TCPServer srv(pTSCF, svs);
    

    【讨论】:

    • 是的,我知道我可以使用新的 TSC() 来做到这一点,但我想提供一个不会在 TCPServer 生命周期结束时自动销毁的持久对象
    • 您可以保留共享指针,这样它就不会在 TCPServer 中被销毁,因为您将拥有最后一个引用计数。我已经更新了上面答案中的代码。
    • 好的,我可以这样做,但是有没有可能创建一个共享 ptr ?
    • TCPServerConnectionFactory::Ptr 是 Poco::SharedPtr,见github.com/pocoproject/poco/blob/develop/Net/include/Poco/Net/…
    • 是的,我知道,但如果我想使用第一个想法,我会将其提供给 TCP 服务器,因为这是 TCPServerConnectionFactory。如果认为我做不到 Poco::Net::TCPServer(TCPServerConnectionFactory::Ptr(this), serverSocket);
    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多