LINUX.ORG.RU

Gloox требует ручной thread sleep при отправке. Или нет?

 ,


0

1

Пытаюсь написать простого отправителя сообщений для xmpp. Решил воспользоваться gloox. Так вот, оказалось, что без ручного засыпания сообщение теряется. Вопрос, если кто знает, как в gloox дождаться отправки сообщения и только потом выйти?

Пример кода:

class MyMessenger: public ConnectionListener {
public:
    MyMessenger(): client( 0 ) {}

    ~MyMessenger() {
        if( client ) delete( client );
    }

    virtual void onConnect() override {
        JID to(DST_JID);
        MessageSession* session = new MessageSession( client, to );
        session->send("test message");
        // вот без этого сообщение теряется.
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        client->disposeMessageSession(session);
        client->disconnect();
    };

    virtual void onDisconnect( ConnectionError ce ) override {
        if( ce == ConnAuthenticationFailed )
            cerr << "Auth failed. Reason: " << client->authError() << endl;
    }

    virtual bool onTLSConnect( const CertInfo& ) override {
        return true;
    }

    void start() {

        JID jid( USER_JID );

        client = new Client( jid, USER_PASS );

        client->setServer( SERVER );
        client->setPort( PORT );
        client->setTls( TLSRequired );

        client->registerConnectionListener( this );

        if( client->connect( false ) ) {
            ConnectionError ce = ConnNoError;

            while( ce == ConnNoError ) {
                ce = client->recv();
            }
            cerr << "ce: " << ce << endl;
        }

    }

private:
    Client* client;
};

★★★★★

По всей видимости send() у них асинхронный и там не сообщение теряется, а коннекшн убивается двумя строчками ниже.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

In these cases non-blocking connections can be used. If ClientBase::connect( false ) is called, the function returnes immediately after the connection has been established. It is then the resposibility of the programmer to initiate receiving of data from the socket.

Судя по всему, если хочется блокирующего send(), чтобы не пришлось костыли с тредами вставлять (или заморачиваться правильной обработкой статуса IO), надо делать connect(true)

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Хм, я почему-то подумал, что это относится только к методу `connect`, а не ко всем.
Но так заработало, спасибо.
Ещё осталось понять как заставить работать MUC, а то нихрена не отылает.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Ну да, коннекшн убивается и сообщение теряется, т.к. не успело отослаться.
Я просто неточно выразился.

WatchCat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.