2013-05-12 23 views
6

私はPOCO C++ライブラリを使用してTCPサーバを開発しようとしています。 私はいくつかの例を見つけましたhere。 最初はAlexからの例を試しましたが、シャットダウンイベントは機能しませんでした。 EchoServerにも同じ問題があります。 それで、私はCesar Ortizの例を試してみたところ、異常な問題がありました。いくつかの時間の後にサーバーがエラーをスローする:POCO C++ライブラリを備えたマルチスレッドTCPサーバ

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
["src/ErrorHandler.cpp", line 60] 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

接続には接続タイムアウトエラーが発生し、新しい接続もあります。 イベントハンドラのセードの例が正しいですが、シャットダウンイベントを修正する方法がわかりません。

答えて

12

マルチスレッドTCPサーバーが必要な場合は、すぐにPoco::Net::TCPServerが実行されます。これは内部的にマルチスレッド化されています。接続を定義すると スタート、これはちょうどあなたがそれに送るものは何でもエコーバックします:

class EchoConnection: public TCPServerConnection { 
public: 
    EchoConnection(const StreamSocket& s): TCPServerConnection(s) { } 

    void run() { 
    StreamSocket& ss = socket(); 
    try { 
     char buffer[256]; 
     int n = ss.receiveBytes(buffer, sizeof(buffer)); 
     while (n > 0) { 
     ss.sendBytes(buffer, n); 
     n = ss.receiveBytes(buffer, sizeof(buffer)); 
     } 
    } 
    catch (Poco::Exception& exc) 
    { std::cerr << "EchoConnection: " << exc.displayText() << std::endl; } 
    } 
}; 

その後、サーバーを実行し、それをいくつかのデータを送信します。返信アレックスのため

TCPServer srv(new TCPServerConnectionFactoryImpl<EchoConnection>()); 
srv.start(); 

SocketAddress sa("localhost", srv.socket().address().port()); 
StreamSocket ss(sa); 
std::string data("hello, world"); 
ss.sendBytes(data.data(), (int) data.size()); 
char buffer[256] = {0}; 
int n = ss.receiveBytes(buffer, sizeof(buffer)); 
std::cout << std::string(buffer, n) << std::endl; 

srv.stop(); 
+0

感謝を。私が言ったように、今私はあなたのような2番目の例を使用しますが、 'src/errorhandler.cpp'メッセージでバグの原因を見つけることができません。このサーバは接続を受け付けた後、新しい接続のバイトを送受信せず、既存の接続に対して「接続タイムアウト」を送出します。 –

+0

接続ハンドラのどこかで例外をスローする必要があります。それはスレッドで実行されるため、デフォルトのエラーハンドラで終了します。 Exceptionはおそらくstd :: exceptionの子孫ではないので、ErrorHandlerはそれについて何も知らない。しかし、あなたは問題が何であるかについて明確な答えを得るのに十分な情報を提供していません。デバッガでコードを実行し、問題の原因がどこにあるかを突き止めるのがベストです。 – Alex

+0

私が言ったように、私はCesar Ortizの例を使って、私はちょうど '実行'機能を変更しました - [ここ](http://hastebin.com/lokadobeve.coffee)私が知ったように、キュー内にあるので、私はなぜ理解できないのですか?現在の接続が16に達すると、新しい接続はすべてキューに追加され、後で拒否されます。 paramsでは、maxqueued(3)、maxthreads(20)、threadidletime(100)を設定しました。 –

関連する問題