1.6k Aufrufe
Gefragt in Anwendungen(Java,C++...) von simontheprogger Mitglied (719 Punkte)
Hallo,

Ich habe schon viel gegoogelt, aber ich finde keine Lösung für mein Problem:
Ich habe mit C++ ein Programm geschrieben, dass einen einfachen TCP-Server erstellt. Dabei habe ich mich für die Unix-Variante mit <sys/sockets> entschieden.

Der Server wird auch ordnungsgemäß erstellt, gebunden und lauscht…
Wenn ich jedoch jetzt die Funktion accept() aufrufe, so hält das Programm solange an, bis eine neue Verbindung aufgebaut wird. Leider lässt sich während dieser Zeit der Server nicht mehr steuern, was aber für mein Projekt sehr sinnvoll wäre.

Leider bringt mich die Google-Suche auch nicht sehr viel weiter, da sich ständig Hilfe zu Php-Sockets oder Winsock untermischt, aber keine Lösung für mein Problem.

Gibt es hier vielleicht einen erfahrenen C++-Socket-Programmierer, der mir helfen kann?

Viele Dank, Simon.

3 Antworten

0 Punkte
Beantwortet von ennok Experte (1.2k Punkte)
0 Punkte
Beantwortet von simontheprogger Mitglied (719 Punkte)
Oh, ja. Danke :)
0 Punkte
Beantwortet von
Das Problem das Sie beschreiben ist mit der dem Aufruf "select(..)"
zu lösen.
Mit select kann auf mehrere socket oder Filehandle gewartet werden.
Dies geht für Schreib- und Lesezugriffe gleichermaßen.

Am select bündeln sich alle Lese und Schreiboperation auf die
gewartet werden werden muss, demzufolge sollte nur ein Select pro
Thread warten. Hat die Task also alle Rechenarbeit erledigt so wird
select aufgerufen und die Task wartet auf ein Ereignis das mit dem select-Aufruf definiert wurde. Zudem noch ein Timeout definierbar.
So kann man unendliche Wartezeiten auf ein sinnvolle Größe limitieren, um z.B. andere Zeitkritische Sachen zwischendurch zu erledigen.

Mit der Select Funktion ist es Möglich einen Server für mehrere Clients
zu schreiben die Simultan bedient werden können ohne Thread Funktionen zu verwenden. Denn eine SingleCore Maschine kann eh
nur alles hintereinander ausführen, und wenn Sie mit einer Clientaufgabe beschäftigt ist müssen die anderen Clients warten.
...