Windows hat keine select()-Funktion?

Dieses Forum ist unmoderiert und ihr könnt über alles mögliche reden, aber nur hier!
Antworten
_Lo_
Beiträge: 14
Registriert: Mo 3. Nov 2008, 23:20

Windows hat keine select()-Funktion?

Beitrag von _Lo_ »

Hi,

bitte helft mir ein Problem zu lösen!!! Ist mir sehr wichtig! (aber ich hab kp von Windows)

Jeder C-Prgrammierer kennt den Hinweis:
"select() kann mit 3 NULL-Pointern und nfds=0 auch als Ersatz für die nicht vorhandene sleep()-Funktion auf anderen Systemen verwendet werden."
Gut. Dann habe ich select also unter Windows genutzt, um sleep zu simulieren.

Code: Alles auswählen


#include "Winsock2.h"

unsigned int windows_sleep(unsigned int secs)
{
        struct timeval tv;
        tv.tv_sec=secs;
        tv.tv_usec=0;
        select(0,NULL,NULL,NULL,&tv);
        return 0;
}

int main() {
        return windows_sleep(3);
}

Hinweis: Ist gegen "Ws2_32.dll" zu linken.

Was passiert? Garnichts! Er tut so, als würde er genau 0 Sekunden schlafen. Dabei gibt es laut MSDN eine select()-Funktion unter Windows. Ich habe es sowohl mit MINGW als auch MSVC versucht - allerdings auf einer Windows-VM.

Hat jemand eine Idee?
Danke für Antworten im voraus!

Gruß,
Johannes
Benutzeravatar
Cauchy
Beiträge: 108
Registriert: So 30. Nov 2008, 17:08

Re: Windows hat keine select()-Funktion?

Beitrag von Cauchy »

Vielleicht überflüssig:

Wie wäre es vielleicht mal nach einer sleep Funktion zu suchen als eine select Funktion dafür zu missbrauchen?
_Lo_
Beiträge: 14
Registriert: Mo 3. Nov 2008, 23:20

Re: Windows hat keine select()-Funktion?

Beitrag von _Lo_ »

Bringt leider nix: erstens ging die auch nicht, und zweitens brauche ich es auch für Mikrosekunden an anderer Stelle.
Chris
Beiträge: 109
Registriert: Mo 3. Nov 2008, 20:31
Wohnort: ca. 5 min zum HSaF ;) also Karlsruhe
Kontaktdaten:

Re: Windows hat keine select()-Funktion?

Beitrag von Chris »

kann ich dir die Hotline von MSDN empfehlen ... das bei uns an der Uni geht auch per messenger ... die können dir das beantworten

http://www.microsoft.com/germany/msdn/h ... fault.mspx
Johann
Beiträge: 65
Registriert: So 9. Nov 2008, 20:21

Re: Windows hat keine select()-Funktion?

Beitrag von Johann »

Zur Überschrift: Natürlich hat Windows eine select()-Funktion. Und Windows hat sogar ein echtes Sleep(), wozu also kompliziert wenns auch einfach geht? Und ja, Sleep() hat je nach System eine andere Auflösung. Wenn du also eine hochauflösende Variante haben willst, nimm QueryPerformanceCounter() (und davor QueryPerformanceFrequency()) und bastel eine While-Loop drum. Da das hier eh Mikrosekunden sind, spielt das vermutlich keine Rolle.
Darf man fragen, wozu du Sockets und mikrosekunden genaues Schlafen brauchst?

Hier ein Codesnippet wie man QueryPerformance* verwendet: http://www.decompile.com/cpp/faq/windows_timer_api.htm
Bild
338364: <Alanna> Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders
_Lo_
Beiträge: 14
Registriert: Mo 3. Nov 2008, 23:20

Re: Windows hat keine select()-Funktion?

Beitrag von _Lo_ »

Danke, MSDN Hotline werde ich vllt mal versuchen.

@Johann: Danke für den Link. Aber ich finde es mal wieder unmöglich, wie dieser Windows-Code von den Standards abweicht. Wieso brauch man denn eine struct Namens LARGE_INTEGER? :fool: Warum ich das "micro-sleep" brauche, ist kompliziert. Es geht darum, Nachrichten von ganz vielen Servern abzuholen. Durch Aufruf von select() in gleichmäßigen Abständen soll dabei nach neuen Antworten geguckt werden. Bei Windows returned select sofort. Das ist doof, denn ich will select() nicht pollen...

Ich glaube aber, die Lösung gefunden zu haben. Laut POSIX wartet select(), wenn bei den FILE-Pointern nix passiert, maximal die Zeit ab, die im time-intervall angegeben ist. In Posix ist es exakt diese Zeit. Werde das wohl bei Windows mit einem nachfolgenden "microsleep"-Befehl ausgleichen müssen.
Johann
Beiträge: 65
Registriert: So 9. Nov 2008, 20:21

Re: Windows hat keine select()-Funktion?

Beitrag von Johann »

Weil ein 32-Bit System keine 64-Bit-Zahlen nativ beherrscht, auch unter Linux nicht. Außerdem versteh ich noch immer nicht ganz das Problem. Wenn du tatsächlich auf einen Filedeskriptor warten willst, übergibt auch einen, dann macht auch select() exakt das was es soll! Mir schien hier aber, du missbrauchst select() als Zeitgeber, dafür ist es nicht gedacht und dafür hat Windows ganz tolle andere APIs.
Bild
338364: <Alanna> Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders
_Lo_
Beiträge: 14
Registriert: Mo 3. Nov 2008, 23:20

Re: Windows hat keine select()-Funktion?

Beitrag von _Lo_ »

Wenn select als Zeitgeber nicht benutzt werden sollte, wie du sagst, für welchen Zweck dann der timeout-Parameter?
Johann
Beiträge: 65
Registriert: So 9. Nov 2008, 20:21

Re: Windows hat keine select()-Funktion?

Beitrag von Johann »

Damit eine Anwendung eine bestimmte Zeit auf Input warten kann, wenn sie möchte. select() ist für keinen anderen Zweck da als zum Filedeskriptoren auf Statusänderungen zu überprüfen, sei es, dass sie nun beschreibbar sind, etwas zu lesen da ist oder ein Fehler aufgetreten ist. Stell dir vor du rufst eine Webseite ab, der Webserver nimmt deine Verbindung entgegen (also connect() gelingt), aber dann rufst du per GET eine Seite ab, die dynamisch generiert wird und lange braucht. Ein recv() würde unbestimmt lang blockieren, bis Daten da sind. Nun willst du aber den User maximal 10 Sekunden warten lassen. Also setzt man das Timeout für select() auf 10 Sekunden und ruft es für das verbundene Socket auf. Ist nach 10 Sekunden noch immer nichts da, kehrt select() zurück und du kannst dem User mitteilen, dass die Gegenseite nicht sendet.

Oder anderes Beispiel von mir: Ich hab einen IRC-Bot geschrieben. Der verbindet zum IRC-Server und recv() kehrt immer dann zurück wenn vom Server eine Nachricht kommt. Das reicht für einen Bot, der nur reagiert völlig. Jetzt verwaltet er aber auch noch eine intere Banlist, die er einmal pro Sekunde durchgehen soll, ob Bans aufzuheben sind. Also rufe ich select() auf das verbundene Socket mit einem Timeout von einer Sekunde auf. Das garantiert, dass min. einmal pro Sekunde die Hauptschleife des Bots ausgeführt wird. Für genau solche Fälle ist select() bzw. dessen Timeout-Parameter da.
Bild
338364: <Alanna> Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders
Antworten

Zurück zu „Spam-Forum“