2013-05-12 4 views
6

Ich versuche, einen TCP-Server mit POCO C++ - Bibliotheken zu entwickeln. Ich fand einige Beispiele here. Zuerst versuchte ich Beispiel von Alex, aber Shutdown-Ereignis hat nicht funktioniert. EchoServer haben das gleiche Problem. Also, dann habe ich Cesar Ortiz Beispiel versucht und ein ungewöhnliches Problem bekommen. Nach einiger Zeit wirft Server einen Fehler:Multithread-TCP-Server mit POCO C++ - Bibliotheken

Und Verbindungen bekam Verbindung Timeout-Fehler, neue Verbindungen sowie. Beispiel mit Eventhandler semeed mehr korrekt, aber ich weiß nicht, wie ich Shutdown-Ereignis beheben kann.

Antwort

12

Wenn alles, was Sie wollen, Multithread-TCP-Server ist, dann wird "out of the box" Poco::Net::TCPServer tun - es ist intern Multithreading. Starten Sie die Verbindung mit der Definition, wird dies ein Echo nur zurück, was auch immer Sie es an:

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; } 
    } 
}; 

Dann den Server laufen und es einige Daten senden:

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

Danke für Ihre Antwort Alex. Wie gesagt, jetzt benutze ich das zweite Beispiel wie bei Ihnen, aber ich kann nicht die Ursache für einen Fehler mit ‚src/errorhandler.cpp‘ Nachricht finden. Nachdem dieser Server Verbindungen akzeptiert, aber keine Bytes für neue Verbindungen sendet oder empfängt und "Verbindungstimeout" für bestehende Verbindungen auslöst. –

+0

Sie müssen irgendwo in Ihrem Verbindungshandler eine Ausnahme auslösen. Da es in einem Thread ausgeführt wird, endet es in der Standardfehlerbehandlung. Ausnahme ist wahrscheinlich kein Nachkomme von std :: exception, daher kennt ErrorHandler nichts davon. Aber Sie liefern nicht genügend Informationen für eine definitive Antwort auf das Problem. Am besten führen Sie Ihren Code im Debugger aus und durchlaufen Sie ihn, um herauszufinden, wo sich die Ursache Ihres Problems befindet. – Alex

+0

Wie gesagt, ich das Beispiel von Cesar Ortiz verwenden, Ich habe gerade ‚run‘ Funktion - [hier] (http://hastebin.com/lokadobeve.coffee) Als ich herausgefunden hat, wenn eine Verbindung keine Daten bekommen könnte weil es in der Warteschlange, aber ich kann nicht verstehen, warum? Wenn Stromanschlüsse 16 erreichen, werden alle neuen Verbindungen hinzugefügt, nachdem die Warteschlange und lehnte ab. In params set I maxqueued (3), MaxThreads (20) und threadidletime (100) –