2013-05-12 14 views
6

Sto provando a sviluppare un server TCP con librerie POCO C++. Ho trovato alcuni esempi here. All'inizio ho provato un esempio da Alex ma l'evento di chiusura non ha funzionato. EchoServer ha lo stesso problema. Quindi, ho provato l'esempio di Cesar Ortiz e ho avuto un problema insolito. Dopo un po 'time server genera un errore:Server TCP multithread con librerie POCO C++

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

e collegamenti ottenuto l'errore di timeout di connessione, le nuove connessioni pure. Esempio con semeed Eventhandler più corretto, ma non so come posso risolvere l'evento di chiusura.

risposta

12

Se tutto ciò che si desidera è un server TCP multi-thread, allora "out of the box" lo farà Poco::Net::TCPServer - è multithreading internamente. Inizia con la definizione del collegamento, questo sarà solo l'eco di nuovo ciò che si invia ad esso:

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

Poi, eseguire il server e inviarlo alcuni dati:

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

Grazie per la risposta Alex. Come ho detto, ora uso il secondo esempio come il tuo, ma non riesco a trovare la causa di un bug con il messaggio "src/errorhandler.cpp". Dopo che questo server accetta le connessioni, ma non invia o riceve byte per nuove connessioni e lancia "timeout della connessione" per le connessioni esistenti. –

+0

È necessario generare un'eccezione da qualche parte nel gestore di connessione. Poiché viene eseguito in un thread, finisce nel gestore degli errori predefinito. L'eccezione non è probabilmente un discendente di std :: exception, quindi ErrorHandler non ne sa nulla. Ma non fornisci informazioni sufficienti per una risposta definitiva su quale sia il problema. Meglio eseguire il codice nel debugger e passarlo attraverso per trovare dove è la fonte del tuo problema. – Alex

+0

Come ho detto, uso l'esempio di Cesar Ortiz, ho appena cambiato la funzione 'run' - [qui] (http://hastebin.com/lokadobeve.coffee) Come ho scoperto, quando una connessione non ha potuto ottenere dati perché in coda, ma non riesco a capire perché? Quando le connessioni correnti raggiungono 16, tutte le nuove connessioni vengono aggiunte alla coda e rifiutate dopo. In params ho impostato maxqueued (3), maxthreads (20) e threadidletime (100) –