2016-07-06 31 views
1

Dies ist mein erster Versuch mit DLib. Mein Ziel ist es, einen Hintergrundserver zu haben, mit dem ich mich mit vielen Client-Threads gleichzeitig verbinden kann. Laut der Dokumentation, start_async() sollte der Weg sein, mit einer konkreten Implementierung von dlib::server gehen, so das ist, wie ich meinen Server einrichten.DLib - Warum akzeptiert start_async() keine Verbindungen in einem Hintergrund-Thread?

class TestServer : public dlib::server 
{ 
    private: 
     void on_connect(dlib::connection& c) 
     { 
      cout << "Hi." << endl; 
     } 

    public: 
     void start_server() 
     { 
      set_listening_ip("127.0.0.1"); 
      set_listening_port(4790); 

      start_async(); 
     } 
}; 

Was folgt, ist meine ServerMain.cpp:

int main(int argc, char** argv) 
{ 
    TestServer ts; 

    try 
    { 
     ts.start_server(); 
    } 
    catch(exception& e) 
    { 
     cerr << e.what() << endl; 
    } 

    return 0; 
} 

Und das ist mein ClientMain.cpp:

int main(int argc, char** argv) 
{ 
    try 
    { 
     iosockstream stream("127.0.0.1:4790"); 

     cout << "CLIENT - Connected." << endl; 
    } 
    catch(exception& e) 
    { 
     cerr << e.what() << endl; 
    } 

    cout << "Done." << endl; 

    return 0; 
} 

Nach meinem Server gestartet haben, jeder Versuch, es mit einem Rechner führt zu verbinden in eine Ausnahme:

unable to connect to '127.0.0.1:4790'

Auch weder lsof noch netstat zeigen alle Prozess hören auf Port 4790. Was mache ich falsch?

Ich bin auf Mac OS X 10.9.5, kompiliert mit -std=c++11 -DDLIB_NO_GUI_SUPPORT.

+0

Upvoted, da Sie uns Code zeigen und scheinbar versucht haben, dies auf eigene Faust zu lösen. Das heißt nicht, dass keine zusätzlichen Details hinzugefügt werden konnten (wie das Betriebssystem usw.) ... –

+0

@JesperJuhl Ich habe Details über das Betriebssystem in der letzten Zeile geschrieben. – pr0gma

Antwort

1

Von DLIB :: Server in der Dokumentation des start_async() es sagt

does NOT block. That is, this function will return right away and 
the server will run on a background thread until clear() or this 
object's destructor is called (or until some kind of fatal error 
occurs). 

So Ihre Server-Programm sofort beendet, weil Sie das Programmende lassen (Sie verlassen main()). Sie müssen etwas tun, um Ihr Programm am Leben zu erhalten. Beispiel: Rufen Sie den Server start() anstelle von start_async() auf.

+0

Ich habe versucht, 'start()', aber es behandelt nicht viele Verbindungen gleichzeitig, aber es tut sequentiell statt. Nach meinem Verständnis der 'on_connect'-Methode sollte es für jeden Verbindungsversuch einen neuen Thread starten, tut es aber nicht. Warum? – pr0gma

+0

Es behandelt viele Verbindungen gleichzeitig. Warum denkst du es nicht? –

+0

Ich habe versucht, eine Begrüßungsnachricht und ein 'while (true);' unmittelbar danach in der 'on_connect'-Funktion zu setzen und dann habe ich 10 Clients eine Verbindung mit dem Server versucht. Sie wurden nacheinander bedient (seltsamerweise musste jeder Verbindungsversuch genau 10 Sekunden von dem vorherigen warten, bevor er bedient wurde). Ich habe erwartet, dass die Grußbotschaften sehr schnell nacheinander gedruckt werden, aber es ist nicht passiert. – pr0gma