C - Unix - Sockets Nicht-blockierend Lesen
Ich versuche eine simple client-server-chat-Programm. Auf der client-Seite, die ich Dreh, aus einem anderen thread zu Lesen alle eingehenden Daten vom server. Das problem ist, ich möchte ordnungsgemäß beendet, der zweite thread, wenn eine person, die logs aus dem Haupt-thread. Ich war versucht, einen der freigegebenen variable "running" zu kündigen, das problem ist, die socket read () - Befehl ist eine Sperrung Befehl, also wenn ich do while(running == 1), der server hat etwas senden vor dem Lesen zurück und die while-Bedingung nochmals überprüft werden. Ich bin auf der Suche nach einer Methode (mit dem common unix sockets nur) zu tun, ein nicht-blockierendes Lesen, im Grunde eine form von peek() würde funktionieren, denn ich kann ständig überprüfen Sie die Schleife, um zu sehen, wenn ich fertig bin.
Den Lesen-thread-Schleife ist unten, jetzt ist es keine mutex ist für die shared-Variablen, aber ich Plane, hinzufügen, dass später, keine Sorge! 😉
void *serverlisten(void *vargp)
{
while(running == 1)
{
read(socket, readbuffer, sizeof(readbuffer));
printf("CLIENT RECIEVED: %s\n", readbuffer);
}
pthread_exit(NULL);
}
InformationsquelleAutor will | 2011-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie machen-Buchse nicht zu blocken, wie vorgeschlagen, in einem anderen post plus wählen Sie verwenden, warten, Eingang mit timeout, wie diese:
Sie können geben Sie "man-wählen Sie" in Ihrem terminal, um detaillierte Beschreibung der Funktion wählen. Als erstes argument auswählst nehmen, die größte von Wert-Deskriptor plus 1. Denn von hier haben wir nur einen Deskriptor, ich Schreibe einfach (sd + 1).
Nicht verstehen, beachten Sie etwa 20-mal. Mein code im Kontext deiner ersten Frage sollte funktioniert wie folgt: 1)überprüfen Sie Flagge(Zeit, um zu beenden?) 2)schlafen bis Eingang oder timeout 3)etwas Lesen 4)goto (1). So ist es die Ausfahrt mit etwas Verzögerung. Aber Sie behandeln soll, die situation, wenn die andere Seite enge Verbindung, und wählen Sie dann die Steuerung wieder an Sie, aber "Lesen" read 0 bytes, und Sie erhalten die busy-loop. So sollten Sie überprüfen, Ergebnis von "Lesen" und exit Schleife, wenn es null ist.
Ich habe es herausgefunden, danke, es war, dass ich den Druck im inneren der Schleife, wenn es keine Eingabe, es war eine Spülung Problem alle gelöst, vielen Dank für die Hilfe 🙂
InformationsquelleAutor fghj
oder, wenn Sie weitere flags:
überprüfen Sie dann die return-Wert Lesen, um zu sehen, ob es Daten zur Verfügung.
Hinweis: ein wenig googlen wird der Ertrag Sie viel voll Beispiele.
Können Sie auch verwenden, blockieren von sockets, und "peek" mit
select
mit einem timeout. Es scheint hier angebracht, damit Sie das nicht tun busy wait.InformationsquelleAutor Karoly Horvath
Das beste ist wahrscheinlich, um loszuwerden, die extra-thread und verwenden
select()
oderpoll()
zu handhaben, alles in einem thread.Wenn Sie wollen, zu halten, den thread, eine Sache, die Sie tun können, ist rufen Sie
shutdown()
auf den sockel mitSHUT_RDWR
, die beendet wird die Verbindung, aufwachen alle Fäden blockiert es aber halten Sie den Datei-Deskriptor gültig. Nachdem Sie sich der reader thread kann man dann schließen Sie die Steckdose. Beachten Sie, dass dies nur auf sockets, die nicht auf andere Arten von Datei-Deskriptor.InformationsquelleAutor jilles
Suchen-Funktion
setsockopt
mit optionSO_RCVTIMEO
.InformationsquelleAutor Andrii
Dies ist möglicherweise nicht die spezifische Antwort, die du suchst, aber kann es sein das der Ort, den Sie finden konnte. Ich bin derzeit zu Lesen:
Unix Network Programming, Volume 1: The Sockets Networking API, 3rd Edition
Und es gibt eine Menge Beispiele von multi-threaded, non-blocking-Servern und-clients. Auch, Sie erklären viel von der Argumentation und der trade-offs, zwischen den verschiedenen Methoden.
Hoffe, das hilft...
Sie sind willkommen für jeden nicht-Anzeige link, den Sie weiterleiten möchten. Ich habe keine Verbindung mit Amazon und Addison-Wesley. Jedoch, Anbindung an Amazon macht es zugänglich zu kaufen, hat previews und reviews und ist in der Regel eine stabile URL, die nicht in Naher Zukunft ablaufen.
Ich habe nicht gedacht, das Amazon, ich meinte, dass der link sich aus durch eine rätselhafte rads.stackoverflow.com. Aber, das sagte ich bereits festgestellt, dass in deinem Beitrag nicht mit diesem link, so ist dies zu sein scheint eine Streiche von StackOverflow selbst. Btw, einfach nur neugierig-Sie sehen, wie ein link in der post(ich dachte nur, dass der link ausgeblendet werden kann vom Autor)?
InformationsquelleAutor Homer6