PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Win32 API - Error 997: I/O operation pending



ThorstenHirsch
08-08-2005, 14:58
Servus!

In einem meiner Perl-Skripte benutze ich die Win32 API, genauer gesagt Win32::NetAdmin::GetDomainController um den Primary Domain Controller einer Domain abzufragen. Leider bekomme ich in meine Zielvariable ab und zu undefined geliefert. Win32::GetLastError sagt mir "997", wozu ich folgendes gefunden habe:

997 Overlapped I/O operation is in progress. ERROR_IO_PENDING
Was hat das zu bedeuten?
Soll ich vielleicht nach GetDomainController ein sleep einbauen, damit Windows genug Zeit hat um die Abfrage durchzuführen? Also quasi:

GetDomainController($a, $b, $c)
if (! defined($c))
{
sleep 1;
}
...oder gar nach dem Sleep nochmal die Abfrage durchführen? Kommt die Antwort dann überhaupt noch? Ich glaub das würde irgendwie nicht so ganz klappen.

Ach ja: da der Fehler nur sehr sehr selten auftritt kann ich das jetzt auch schlecht testen. Probieren geht hier nicht über Studieren.

Was meint Ihr denn dazu?

Gruß
Thorsten

Joghurt
08-08-2005, 15:39
Ich schätze mal, der Fehler heißt soviel wie "Try again later", also nach dem Sleep wirst du die Funktion nochmal aufrufen müssen. (Wie sollte $c sonst auch geändert werden?)

ThorstenHirsch
09-08-2005, 17:42
Hab's jetzt jedenfalls mal in ne FOR-Schleife gepackt, so dass bis zu 3 Abfragen im Abstand von 60sek ausgeführt werden. Das sollte reichen.

Joghurt
10-08-2005, 09:40
Sind 60 Sekunden Wartezeit nicht ein bisschen viel? Nach 5 Sekunden meint der Ottonormalbenutzer doch schon, dass das Programm abgeschwirrt ist.

Mein Vorschlag: 30 Versuche alle 6 Sekunden lang

ThorstenHirsch
10-08-2005, 16:03
Nee, ist schon okay. Das läuft während eines laaaaangen Vorgangs automatisch im Hintergrund ab. Da kommt's auf 3min nicht an. Aber ich überlege auch, ob ich nicht mehr Versuche zulassen soll, damit das Skript auch resistend dagegen ist, wenn mal jemand über ein Kabel stolpert und erst nach 10min zur Sau gemacht wird, es also 15min dauert, bis wieder alles funktioniert. :)
...naja, ich will an der Stelle das ganze auch nicht unnötig aufblähen. Aber 30 Sekunden / 30 Versuche...das werd ich wohl noch machen.