マルチスレッド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();
感謝を。私が言ったように、今私はあなたのような2番目の例を使用しますが、 'src/errorhandler.cpp'メッセージでバグの原因を見つけることができません。このサーバは接続を受け付けた後、新しい接続のバイトを送受信せず、既存の接続に対して「接続タイムアウト」を送出します。 –
接続ハンドラのどこかで例外をスローする必要があります。それはスレッドで実行されるため、デフォルトのエラーハンドラで終了します。 Exceptionはおそらくstd :: exceptionの子孫ではないので、ErrorHandlerはそれについて何も知らない。しかし、あなたは問題が何であるかについて明確な答えを得るのに十分な情報を提供していません。デバッガでコードを実行し、問題の原因がどこにあるかを突き止めるのがベストです。 – Alex
私が言ったように、私はCesar Ortizの例を使って、私はちょうど '実行'機能を変更しました - [ここ](http://hastebin.com/lokadobeve.coffee)私が知ったように、キュー内にあるので、私はなぜ理解できないのですか?現在の接続が16に達すると、新しい接続はすべてキューに追加され、後で拒否されます。 paramsでは、maxqueued(3)、maxthreads(20)、threadidletime(100)を設定しました。 –