send() recv() gleichzeitig

Thomasio

Erfahrenes Mitglied
Wenn ich 2 threads für einen socket habe, von denen einer permanent im recv() hängt, sprich den socket blockt, kann ich dann trotzdem im anderen thread send() ausführen, oder muss send() dann warten, bis recv() irgendwas empfangen hat?
 
Zuletzt bearbeitet:
Hey,

ich weiß es nicht genau, aber ich glaube du kannst trotzdem senden.
Ich würde es aber dann eh mit der select-Funktion machen, da diese Funktion den Socket nur "blockiert" wenn auch wirklich was ankommt, bzw. was gesendet wird. Ansonsten is der socket immer non-blocking. Ich habe auch ein Programm was ständig "horcht" ob was kommt, und über den Socket aber auch immer wieder was sende. Es funktioniert einwandfrei. Aber glaube dass es eben an der select-Funktion liegt. Diese ist zudem noch Resourcend schonend :)

gruß
 
Mein Problem ist, wenn ich mit select() den Socket abfrage, ob denn was angekommen ist, muss ich dazu einen Timer oder Loop samt Sleep() einbauen, der den select() in regelmässigen Abständen wiederholt.
Das Kürzeste was ich dazu im Web gefunden habe ist eine Funktion mit 17 Zeilen, statt dem einfachen Aufruf von recv().
Ich habe keine Ahnung, was dabei weniger Resourcen braucht, das ist für mich Anfänger eher unwichtig, es ist einfach vom Code her viel übersichtlicher, wenn ich den Empfang einfach im recv() hängen lasse, bis etwas ankommt.

Ich habe das mitlerweile einfach ausprobiert, und auf den ersten Blick scheint es zu funktionieren.

Auf jeden Fall danke für die Antwort, falls jemand noch etwas Definitives dazu weiss, wäre ich glücklich.
 
Normalerweise nicht. Das Programm wartet bei dem Funktionsaufruf von select() und geht erst weiter wenn eben etwas angekommen ist. Wenn man das mit select() mal verstanden hat, ist es eigentlich ganz einfach :). Aber man muss sich halt ein bisschen damit beschäftigen. Ich habe gute Tutorials über select() und allem drum rum: http://www.c-worker.ch/tuts.php

Aber wenn es klappt ist ja gut...

gruß
 
Mein Problem ist, wenn ich mit select() den Socket abfrage, ob denn was angekommen ist, muss ich dazu einen Timer oder Loop samt Sleep() einbauen, der den select() in regelmässigen Abständen wiederholt.
Um die Loop kommst du sowiese nicht herum; die benötigst du auch bei recv(), denn ich gehe nicht davon aus, dass du nur einmalig lesen willst. Select() ist sinnvoll, wenn du mehrere Sockets gleichzeitig überwachen musst (Server) ansonsten (Client) reicht recv(). Auf jeden Fall sollst du alle Funktionen blockierend einsetzen (bei select() dazu ein unendliches Timeout einstellen), weil das am resourcenschonensten ist. Dann kannst du auch auf Sleep() in der Schleife verzichten.


Ansonsten spricht nichts dagegen, auch zu jeden beliebigen Zeitpunkt zu senden (wenn es denn aus Sicht des Datenflusses Sin macht). Um die Koordination kümmert sich die Socket-API .

Gruß
MCoder
 
Logisch steht der recv() in einem Endlos Loop.
Beide Enden müssen jeweils nur einen Socket verwalten, weil am Server Ende jeder Client einen eigenen Thread bekommt, das funktioniert schon seit über einem Jahr prima und bleibt bei über 50 Usern gleichzeitig auf einem winzigen VServer bei unter 2% CPU Auslastung.
Was ich gerne machen würde ist noch ein zusätzlicher Thread zum senden, so dass ich den recv() nicht unterbrechen muss, wenn es etwas zu senden gibt, insbesondere für broadcasts an alle Clients wäre das halt sehr praktisch, ich müsste nur sicher wissen, dass send() durch geht, selbst wenn am selben socket ein anderer Thread im recv() hängt (im ersten Test scheint es ja zu funktionieren).
 
Zurück