2

Zaphoydは、Websocketbroadcast_server.cppサーバーの完璧なバックボーンのように見えます。これは、通信を中断しないように、実際のアクションのためのスレッドとのメッセージと接続をすばやく受け入れて送信できます。 https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

彼の単純なprint_server.cpp例は簡単にコンパイルできます。ただし、でいくつかのコンパイル エラーが発生しbroadcast_server.cppます。

root@server:~# g++ -O3 broadcast_server.cpp -I ~/websocketpp-experimental/ -lboost_system
broadcast_server.cpp:126:37: error: 'owner_less' is not a member of 'std'
broadcast_server.cpp:126:37: error: 'owner_less' is not a member of 'std'
broadcast_server.cpp:126:70: error: 'con_list' was not declared in this scope
broadcast_server.cpp:126:70: error: template argument 2 is invalid
broadcast_server.cpp:126:18: warning: 'typedef' was ignored in this declaration [enabled by default]
broadcast_server.cpp:129:5: error: 'con_list' does not name a type
broadcast_server.cpp: In member function 'void broadcast_server::process_messages()':
broadcast_server.cpp:109:17: error: 'm_connections' was not declared in this scope
broadcast_server.cpp:112:17: error: 'm_connections' was not declared in this scope
broadcast_server.cpp:116:17: error: 'con_list' has not been declared
broadcast_server.cpp:116:36: error: expected ';' before 'it'
broadcast_server.cpp:117:22: error: 'it' was not declared in this scope
broadcast_server.cpp:117:27: error: 'm_connections' was not declared in this scope

私は c++ を初めて使用します。これらはおそらく単純な問題ですが、解決方法がわかりません。

'owner_less' is not a member of 'std'? http://en.cppreference.com/w/cpp/memory/owner_less

template argument 2 error上記が解決すれば解消されると思います。

'con_list' was not declared in this scopeいつそこにあるのprivate:ですか?と同じ'm_connections'

'con_list' has not been declared上記のエラーが発生すると、それはなくなると思います。

'it'それが何について話しているのか、なぜその前にあるべきなのかわかりません;

バージョン

Ubuntu 12.10

gcc --version gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

ブースト 1.53.0

余分#include

#include <cstdlib>
#include <iostream>
#include <memory>
#include <set>

まだ何もない

-std=c++11

In file included from /usr/include/c++/4.7/map:60:0,
                 from /usr/local/include/boost/date_time/gregorian/greg_month.hpp:18,
                 from /usr/local/include/boost/date_time/gregorian/greg_ymd.hpp:16,
                 from /usr/local/include/boost/date_time/gregorian/greg_calendar.hpp:16,
                 from /usr/local/include/boost/date_time/gregorian/gregorian_types.hpp:19,
                 from /usr/local/include/boost/date_time/posix_time/posix_time_config.hpp:18,
                 from /usr/local/include/boost/date_time/posix_time/posix_time_system.hpp:13,
                 from /usr/local/include/boost/date_time/posix_time/ptime.hpp:12,
                 from /usr/local/include/boost/date_time/posix_time/posix_time_types.hpp:12,
                 from /usr/local/include/boost/thread/thread_time.hpp:11,
                 from /usr/local/include/boost/thread/lock_types.hpp:18,
                 from /usr/local/include/boost/thread/pthread/thread_data.hpp:12,
                 from /usr/local/include/boost/thread/thread.hpp:17,
                 from /usr/local/include/boost/thread.hpp:13,
                 from /root/websocketpp-experimental/websocketpp/common/thread.hpp:41,
                 from /root/websocketpp-experimental/websocketpp/concurrency/basic.hpp:31,
                 from /root/websocketpp-experimental/websocketpp/config/core.hpp:35,
                 from /root/websocketpp-experimental/websocketpp/config/asio_no_tls.hpp:31,
                 from broadcast_server.cpp:1:
/usr/include/c++/4.7/bits/stl_tree.h: In instantiation of 'class std::_Rb_tree<boost::weak_ptr<void>, boost::weak_ptr<void>, std::_Identity<boost::weak_ptr<void> >, std::owner_less<boost::weak_ptr<void> >, std::allocator<boost::weak_ptr<void> > >':
/usr/include/c++/4.7/bits/stl_set.h:116:17:   required from 'class std::set<boost::weak_ptr<void>, std::owner_less<boost::weak_ptr<void> > >'
broadcast_server.cpp:132:14:   required from here
/usr/include/c++/4.7/bits/stl_tree.h:471:31: error: invalid use of incomplete type 'struct std::owner_less<boost::weak_ptr<void> >'
In file included from /usr/include/c++/4.7/bits/shared_ptr.h:52:0,
                 from /usr/include/c++/4.7/memory:87,
                 from /usr/local/include/boost/config/no_tr1/memory.hpp:21,
                 from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:27,
                 from /usr/local/include/boost/shared_ptr.hpp:17,
                 from /usr/local/include/boost/date_time/time_clock.hpp:17,
                 from /usr/local/include/boost/thread/thread_time.hpp:9,
                 from /usr/local/include/boost/thread/lock_types.hpp:18,
                 from /usr/local/include/boost/thread/pthread/thread_data.hpp:12,
                 from /usr/local/include/boost/thread/thread.hpp:17,
                 from /usr/local/include/boost/thread.hpp:13,
                 from /root/websocketpp-experimental/websocketpp/common/thread.hpp:41,
                 from /root/websocketpp-experimental/websocketpp/concurrency/basic.hpp:31,
                 from /root/websocketpp-experimental/websocketpp/config/core.hpp:35,
                 from /root/websocketpp-experimental/websocketpp/config/asio_no_tls.hpp:31,
                 from broadcast_server.cpp:1:
/usr/include/c++/4.7/bits/shared_ptr_base.h:270:12: error: declaration of 'struct std::owner_less<boost::weak_ptr<void> >'

インストール方法(依存関係、実際のプログラムなど)

https://github.com/zaphoyd/websocketpp/wiki/Setup-0.3X-on-Ubuntu-12.10

代替歓迎

に代わるものがある場合はstd::owner_less、投稿してください。

4

2 に答える 2

5

std::owner_less は、std::weak_ptr を set や map などの連想コンテナーに配置できるようにする C++11 STL 機能です。最終的に、connection_hdl は weak_ptr であるため、カスタム比較関数が必要です。

WebSocket++ 0.3.x は、C++03 + Boost または C++11 のいずれかを使用するようにプリプロセッサ定義を介して構成できます。デフォルトでは、C++03 + Boost を使用します。Boost weak_ptr の動作は少し異なり、カスタム比較関数は必要ありません。リスト、キュー、またはベクトルを使用する場合、これらのコンテナーは connection_hdl をキーとして使用しないため、これも不要です。

0.3.x マニュアルおよびライブラリにバンドルされているほとんどの例では、よりクリーンで簡潔な C++11 を使用しています。これらの例をそのままコンパイルしてリンクするには、C++11 コンパイラが必要であり、適切な C++11 コンパイラ フラグと WebSocket++ 定義を使用する必要があります。Scons は、すべてのサンプルと単体テストのビルドと実行を自動化するために使用するビルド システムです。個々のサンプル プログラムをビルドして実行する必要はありません。コマンド ラインでアドホックなコンパイラ引数を供給する場合と同様に、他のビルド システムは正常に動作するはずです。

C++11 機能を有効/無効にするためのさまざまなオプションを説明するページをマニュアルに設定しました。http://www.zaphoyd.com/websocketpp/manual/reference/cpp11-support . このマニュアル ページには、私がテストに最もよく使用するオペレーティング システムとコンパイラの推奨コンパイラ フラグのリストがあります。

Linux 上の g++ 4.7 の場合、「-std=c++0x -D_WEBSOCKETPP_CPP11_STL_ -D_WEBSOCKETPP_NO_CPP11_REGEX_ -lboost_regex -lboost_system」をお勧めします。これにより、ライブラリ (壊れている/バグがある) を除くすべての C++11 機能が有効になり、代わりに Boost バージョンが導入されます。

于 2013-03-18T03:26:18.157 に答える
2

ドキュメントを読んだ後、ビルド時に定義する必要があると思いますBOOST_ROOT_CPP11

BOOST_ROOT に似ていますが、C++11 STL に対してコンパイルされた別のバージョンの Boost にリンクできます

これは、次のヘッダーに基づいています

#ifdef _WEBSOCKETPP_CPP11_MEMORY_
    using std::shared_ptr;
    using std::weak_ptr;
    using std::enable_shared_from_this;
    using std::static_pointer_cast;

    typedef std::unique_ptr<unsigned char[]> unique_ptr_uchar_array;
#else
    using boost::shared_ptr;
    using boost::weak_ptr;
    using boost::enable_shared_from_this;
    using boost::static_pointer_cast;

    typedef boost::scoped_array<unsigned char> unique_ptr_uchar_array;
#endif

std::weak_ptr代わりにどちらを使用する必要がありますかboost::weak_ptr


の代わりに別のコンテナを使用する場合はstd::set、この疑似コードのように例を変更します。

         if (a.type == SUBSCRIBE) {
                boost::unique_lock<boost::mutex> lock(m_connection_lock);
                m_connections.push_back(a.hdl);
            } else if (a.type == UNSUBSCRIBE) {
                boost::unique_lock<boost::mutex> lock(m_connection_lock);
                m_connections.erase(std::remove(m_connections.begin(), m_connections.end(), a.hdl));
            } else if (a.type == MESSAGE) {
                boost::unique_lock<boost::mutex> lock(m_connection_lock);

                con_list::iterator it;
                for (it = m_connections.begin(); it != m_connections.end(); ++it) {
                    m_server.send(*it,a.msg);
                }
            } else {
                // undefined.
            }
        }
    }
private:
    typedef std::deque<connection_hdl> con_list;

std::dequeの代わりに使用しstd::setます。順序付けは使用されませんが、この例では必要ないことがわかります。

于 2013-03-15T14:35:12.307 に答える