2013-05-12 93 views
6

我正在嘗試開發一個帶有POCO C++庫的TCP服務器。我發現一些例子here。 起初我試過Alex的例子,但關機事件沒有奏效。 EchoServer有同樣的問題。 因此,我嘗試了塞薩爾奧爾蒂斯的例子,並得到了一個不尋常的問題。一段時間後,服務器將引發一個錯誤:帶POCO C++庫的多線程TCP服務器

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

和連接了連接超時錯誤,新的連接也是如此。 事件處理程序示例semeed更正確,但我不知道如何修復關閉事件。

回答

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

感謝您的回覆亞歷克斯。正如我所說的,現在我使用第二個例子,但是我找不到'src/errorhandler.cpp'錯誤的原因。此服務器接受連接後,但不會爲新連接發送或接收字節,併爲現有連接拋出「連接超時」。 – 2013-05-15 05:15:01

+0

您必須在連接處理程序的某處拋出異常。由於它在一個線程中運行,它將以默認錯誤處理程序結束。異常可能不是std :: exception的後代,所以ErrorHandler對此一無所知。但是你沒有提供足夠的信息來明確問題的答案。最好在調試器中運行你的代碼,並逐步找出問題的根源。 – Alex 2013-05-15 14:21:59

+0

正如我所說的,我使用Cesar Ortiz的例子,我只是改變了'運行'功能 - [這裏](http://hastebin.com/lokadobeve.coffee)正如我發現的,當連接無法獲取數據因爲它在排隊,但我不明白爲什麼?當前連接數達到16時,所有新連接將被添加到隊列中,並在之後被拒絕。在params中,我設置了maxqueued(3),maxthreads(20)和threadidletime(100) – 2013-05-16 15:40:21