Bei OpenNetworkConnection() einen Timeout festlegen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Bei OpenNetworkConnection() einen Timeout festlegen?

Beitrag von pvmichael »

Hi!

kann man bei OpenNetworkConnection() irgendwie einen Timeout festlegen? Bei mir wird 20 Sekunden gewartet, bis ein Timeout festgestellt wird.

Grüsse

Michael
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag von pvmichael »

Zur Not wäre ich auch mit einer WinAPI Lösung zufrieden :(
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

pvmichael hat geschrieben:Zur Not wäre ich auch mit einer WinAPI Lösung zufrieden :(
Wie z.B. InternetOpen_() ?

Bei mir wartet dies auch eine lange Zeit, ohne dies einstellen zu können. Scheint also Windows-spezifisch zu sein, es sei denn jemand wüsste noch eine andere Lösung... :|
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag von PBZecke »

OpenNetworkConnection() in einen Thread packen, dann wird Dein Programm wenigstens nicht blockiert. Ob das funktioniert weiß ich aber nicht, habe bis jetzt weder Netzwerk oder Treadfunktionen in PB benutzt. War nur so einene Idee.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Hm, also ich hab das problem auch schon vor langer Zeit festgestellt, aber mich damit abgefundenn. Allerdings wäre es doch möglich, das in einen Thread zu setzten und diesen einfach früher zu beenden. Oder gibs da risiken? Was auch immer ich damit meine /:->

Code: Alles auswählen

InitNetwork()

Global ConnectionID.l

Procedure OpenNetworkServer(Port.l)
  ConnectionID=OpenNetworkConnection("www.Test.de",Port.l)
EndProcedure

MS = ElapsedMilliseconds()
ThreadID = CreateThread(@OpenNetworkServer(),6660)
WaitThread(ThreadID) 
If ConnectionID <> 0 : CloseNetworkConnection(ConnectionID) : EndIf
Debug "ohne Thread"
Debug "ID: " + Str(ConnectionID)
Debug "MS: " + Str(ElapsedMilliseconds() - MS)


MS = ElapsedMilliseconds()
ThreadID = CreateThread(@OpenNetworkServer(),6660)
Delay(10000)
KillThread(ThreadID)
If ConnectionID <> 0 : CloseNetworkConnection(ConnectionID) : EndIf
Debug "Thread"
Debug "ID: " + Str(ConnectionID)
Debug "MS: " + Str(ElapsedMilliseconds() - MS)
MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

vielleicht hilft das:
http://msdn.microsoft.com/library/defau ... _flags.asp
INTERNET_OPTION_CONNECT_TIMEOUT
2
Sets or retrieves an unsigned long integer value that contains the time-out value, in milliseconds, to use for Internet connection requests. If a connection request takes longer than this time-out value, the request is canceled. When attempting to connect to multiple IP addresses for a single host (a multihome host), the timeout limit is cumulative for all of the IP addresses. This option can be used on any HINTERNET handle, including a NULL handle. It is used by InternetQueryOption and InternetSetOption.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
coldarchon
Beiträge: 26
Registriert: 08.09.2004 09:33
Kontaktdaten:

Beitrag von coldarchon »

also 20 Sekunden sind für eine Netzwerkverbindung eine gute Zeit, bei weniger wirst Du einen hohen Beta Fehler erhalten.
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag von pvmichael »

Also PMV's Lösungsvorschlag gefällt mir schon sehr gut. Allerdings ist Coldarchon's Einwand auch nicht ohne.

Der Grund, weshalb ich den Timeout heruntersetzen will ist, dass ich ein Tool schreibe, dass die Verfügbarkeit von Netzwerkdiensten verschiedener Server prüft. Dabei wird momentan ein Dienst/Server nach dem anderen überprüft. So lange alle Server und Dienste erreichbar sind, ist alles schön und gut, aber wenn ein Dienst oder Server ausgefallen ist, dann dauert der Prüfvorgang n*20 Sekunden so lange, als wenn alles erreichbar ist.

Im Prinzip wäre ein paralleles prüfen sehr interessant, aber da wüsste ich nicht, wie ich hinterher die Ergebnisse auswerten könnte.

Viele Grüsse

pvmichael
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Die Ergebnisse wären dann doch nur, ob sie verfügbar sind oder nicht. Da würde es doch reichen, ein Array zu benutzten.

Also nach dem was ich jetzt von dir weiß würde das ganze doch so am besten funktionieren:

-Array auf die Anzahl der Dienste dimensionieren
-für jeden dienst einen thread starten, welcher versucht dorthin zu connection
-die Ergebnisse der Versuche dann einfach in das Array schreiben, dienst 1 also in Array(0), Dienst 2 in Array(1) usw.
-warten bis alle threads beendet sind oder abgebrochen wurden
-in einer schleife die arrays überprüfen, ob sie <> 0 sind

Das wärs doch, oder?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag von pvmichael »

Hi PMV,

Danke! Das trifft es schon ziemlich gut!

So ist es im Moment:

Eine Schleife, welche die zu prüfenden Server/Dienste raussucht, führt ein OpenNetworkConnection aus, wertet das Ergebnis aus, und gibt den entsprechenden Status im ListIconGadget aus. Danach kommt der nächste Schleifendurchlauf.

Ich werde es (wahrscheinlich) so machen:

Eine Schleife, welche die zu prüfenden Server/Dienste raussucht, stösst je einen Thread an. Ich hoffe, man kann einem Thread Parameter übergeben? Jeder diese Threads ändert für sich den Eintrag im ListIconGadget. Damit laufen die ja dann quasi parallel.

Bin gespannt ob das klappt :-)

viele Grüsse

Michael
Antworten