libPoco を使用してダミー サーバーを作成し、クライアント コードをテストしています。
class ServerRunnable: public Poco::Runnable {
public:
ServerRunnable(StreamSocket conn) : conn(conn) {
}
void run(){
string mess("Can you hear me?\n");
try{
this->conn.sendBytes(mess.c_str(), mess.size());
} catch (Poco::Exception& ex){
cerr << ex.displayText() << endl;
return;
}
cerr << "The message has been sent." << endl;
}
void setConn(StreamSocket inConn){
this->conn = inConn;
}
private:
StreamSocket conn;
};
int main(int argc, char **argv){
ServerSocket s;
try{
s.bind(8083, true);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
exit(1);
}
s.listen(124);
Poco::ThreadPool Pool(10, 25, 60, 128);
while(1){
try{
StreamSocket conn = s.acceptConnection();
ServerRunnable serveIt(conn);
Pool.start(serveIt);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
Pool.joinAll();
exit(1);
}
}
return 0;
}
Poco::Runnable
は抽象クラスであり、実行は純粋な仮想関数であると確信しています。Pool.start(serveIt)
を呼び出しているようServerRunnable
ですrun
。コンソールから実行すると、一貫してpure virtual method called
エラーが発生します。ただし、gdb でコードをステップ実行している場合は、クライアントからの接続を正常に受け入れてデータを送信します。は純粋な仮想関数ではなく、それを呼び出す必要がありますServerRunnable
。run
libPoco の Threading のコード例は、http: //pocoproject.org/slides/130-Threads.pdf にあります。
コンストラクターで純粋仮想メソッドを呼び出している可能性も考えていますが、コンストラクターには何もなく、デフォルトのデスタクターを使用しているだけです。どこでどの純粋仮想関数が呼び出されているかを特定する方法はありますか? gdbで?ありがとう。