如果你想要的是多線程的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();
感謝您的回覆亞歷克斯。正如我所說的,現在我使用第二個例子,但是我找不到'src/errorhandler.cpp'錯誤的原因。此服務器接受連接後,但不會爲新連接發送或接收字節,併爲現有連接拋出「連接超時」。 – 2013-05-15 05:15:01
您必須在連接處理程序的某處拋出異常。由於它在一個線程中運行,它將以默認錯誤處理程序結束。異常可能不是std :: exception的後代,所以ErrorHandler對此一無所知。但是你沒有提供足夠的信息來明確問題的答案。最好在調試器中運行你的代碼,並逐步找出問題的根源。 – Alex 2013-05-15 14:21:59
正如我所說的,我使用Cesar Ortiz的例子,我只是改變了'運行'功能 - [這裏](http://hastebin.com/lokadobeve.coffee)正如我發現的,當連接無法獲取數據因爲它在排隊,但我不明白爲什麼?當前連接數達到16時,所有新連接將被添加到隊列中,並在之後被拒絕。在params中,我設置了maxqueued(3),maxthreads(20)和threadidletime(100) – 2013-05-16 15:40:21