Как я могу использовать Poco :: Net :: SocketConnector? - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу подключиться к серверу (например, EchoServer) с помощью Poco::Net::SocketConnector. Но, к сожалению, я не понимаю, как работает SocketConnector.

Мой код:

class ClientHandler
{
public:
    ClientHandler(StreamSocket& socket, const 
    SocketReactor::Ptr& reactor) :
    _socket(socket),
    _reactor(reactor),
    _or(*this, &ClientHandler::onReadable),
    _ow(*this, &ClientHandler::onWritable),
    _ot(*this, &ClientHandler::onTimeout),
    {
        _reactor->addEventHandler(_socket, _or);
        _reactor->addEventHandler(_socket, _ow);
        _reactor->addEventHandler(_socket, _ot);
    }

    ~ClientHandler()
    {
        std::cout << "~ClientHandler" << std::endl;
    }

    void onReadable(ReadableNotification* pNf)
    {
        pNf->release();

        char buffer[32];
        int n = _socket.receiveBytes(buffer, sizeof(buffer));
        if (n == 0)
            return;

        for (size_t i = 0; i < n; ++i)
        {
            std::cout << (int)buffer[i] << " ";
        }
        std::cout << std::endl;
    }

    void onWritable(WritableNotification* pNf)
    {
        pNf->release();

        UInt8 data[] = { 0x01, 0x02, 0x03 };
        _socket.sendBytes(data, 3);
    }

    private:
        StreamSocket _socket;
        SocketReactor::Ptr  _reactor;
        Observer<ClientHandler, ReadableNotification> _or;
        Observer<ClientHandler, WritableNotification> _ow;
        Observer<ClientHandler, TimeoutNotification>  _ot;

};

использование:

EchoServer echoServer;

SocketAddress sa("localhost", echoServer.port());
SocketConnector<ClientHandler> connector(sa, reactor);

Poco::Thread thread;
thread.start(reactor);

Poco::Thread::sleep(1000 * 3);
reactor->stop();
thread.join();

Я успешно подключаюсь, но моя проблема в том, что я не понимаю, как получить доступ к ClientHandler, чтобы отправить что-то другое, кроме 1 2 3.

И вторая проблема: где уничтожен ClientHandler? 1016 *

...