2017-05-15 1 views
0

Ich habe einen Server läuft gut. Dieser Server ist ein Multi-Client und es funktioniert gut, aber ich denke nicht, dass ich den besten Ansatz dafür benutze und der Hauptpunkt für diese Annahme ist die Art, wie ich die Anwendung "verlasse". Ich bearbeite Signale und verlasse gerade, aber es ist nicht richtig, ich kann nicht sogar debuggen, Valgrind verwendend. In meinen anderen Anwendungen, verwende ich eine globale Variable App Zustand zu halten, zum Beispiel pexit und in jedem Thread, der ‚für immer‘ läuft, die Bedingung ist:Der beste Weg, auf Verbindungen in C zu hören - Socket

while (!pexit) .... 

Und im Signal handelt ich nur gesetzt ' pexit 'zu' wahr 'und alles funktioniert gut. Aber mein Problem ist in der Abhörfunktion, die "blockiert", daher kann ich meine globale Variable nicht verwenden. Ist das ein besserer Weg ohne Blockieren?

while ((client_sock = accept(socket_desc, (struct sockaddr *) &client, (socklen_t*) & c))) { 
.... 
+1

http://stackoverflow.com/questions/2486335/wake-up-thread-blocked-on-accept-call – pm100

+0

akzeptieren Blöcke, bis eine Verbindung bereit ist. Bitte schauen Sie sich 'man getaddrinfo' für ein Beispiel eines Socket-Servers und Clients an. –

+0

Die Antwort hängt wahrscheinlich vom Betriebssystem ab, welches verwenden Sie? Im Allgemeinen würde ich mir nicht zu viele Gedanken über das Aufräumen beim Herunterfahren machen, weil das OS sowieso alles aufräumt. – alain

Antwort

1

In Ihrer Hauptschleife statt accept() der Aufruf direkt select() verwenden für eine eingehende Verbindung zu überprüfen. Fügen Sie socket_desc (der "Mutter" -Sockel) der Liste der zu beobachtenden Dateideskriptoren hinzu, und legen Sie ein geeignetes Zeitlimit fest. Wenn select() mit dem Bit für socket_desc zurückgesetzt wird, können Sie accept() ohne Blockierung aufrufen. Und das Timeout stellt sicher, dass der select() Aufruf nicht unbegrenzt blockiert.

Verwandte Themen