2017-12-10 6 views
0

Wenn ich den TCPServer innerhalb von main initialisiere funktioniert es, wenn ich versuche es mit der startServer() Funktion zu starten funktioniert es nicht, ich meine ich kann keine Verbindung herstellen Kitt.Poco TCPServer startet nicht außerhalb von

Was mache ich hier falsch?

Danke für jede Hilfe.

class EchoConnection : public TCPServerConnection { 
public: 
EchoConnection(const StreamSocket& s) 
    : TCPServerConnection(s) {} 

void reply(char buffer[]) 
{ 
    bzero(buffer, 256); 
    std::string myWord = "myWord\n\r"; 
    strcpy(buffer, myWord.c_str()); 
} 

void run() { 
    StreamSocket& ss = socket(); 
    try { 
     char buffer[256]; 
     int n = ss.receiveBytes(buffer, sizeof(buffer)); 
     while (n > 0) { 
      reply(buffer); 
      ss.sendBytes(buffer, sizeof(buffer)); 
      n = ss.receiveBytes(buffer, sizeof(buffer)); 
     } 
    } 
    catch (Poco::Exception& exc) 
    { std::cerr << "EchoConnection: " << exc.displayText() << std::endl; } 
} 
}; 

void startServer() 
{ 
    Poco::Net::TCPServer srv(new Poco::Net::TCPServerConnectionFactoryImpl<EchoConnection>, 8089); 
    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; 
} 

int main(int argc, char** argv) { 

    Poco::Net::TCPServer srv(new Poco::Net::TCPServerConnectionFactoryImpl<EchoConnection>, 8089); 
    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; 

    // startServer(8089); 

    ModuleData modData; 
    modData.ModuleNumber = 1; 
    modData.ModuleTypeId = 1; 

    string test = modData.serialize(); 

    ifstream dataFile; 
    dataFile.open("ModuleData.dat"); 
    if (dataFile.is_open()) 
    { 
     string line; 
     while (getline(dataFile, line)) 
     { 
      cout << line << std::endl; 
     } 
     dataFile.close(); 
    } 

    while (1) 
    { 

    } 

    srv.stop(); 
} 
+0

Warum müssen Sie es außerhalb von 'main()' eigentlich initialisieren? – user0042

+0

Es besteht keine Notwendigkeit, es außerhalb von main zu initialisieren. Aber ich möchte es in eine eigene cpp-Datei verschieben. Ich würde gerne verstehen, wo der Unterschied bei der Initialisierung außerhalb von main liegt. – Helmut

+0

Es gibt keine Garantien über die Reihenfolge, in der die Initialisierungssequenzen außerhalb von 'main()' ausgeführt werden, und die Reihenfolge, in der sie ausgeführt werden. Das könnte ein Grund für das Verhalten sein, das Sie beobachten. – user0042

Antwort

0

Am Ende der Funktion startServersrv Objekt gelöscht wird. TCPServer verwendet eigenen Thread, aber es funktioniert in Destruktor von TCPServer.

Blick auf die Umsetzung von ~ TCPServer

TCPServer::~TCPServer() { 
try { 
    stop(); 
    _pDispatcher->release(); 
... 
} 

und stop siehe Methodenimplementierung

void TCPServer::stop() { 
    if (!_stopped) 
    { 
     _stopped = true; // !! 
     _thread.join();  // waiting for thread 
     _pDispatcher->stop(); 
    } 
} 

der Körper des Thread-Funktion in run Methode ist

void TCPServer::run() 
{ 
    while (!_stopped)  // this flag was set by stop method 
    { 
    ... // body of thread function 
    } 
} 

stop Methode setzt _stopped auf wahr, und aus diesem Grund endet der Faden zu arbeiten.