Seite 1 von 1

isConnection() gesucht... *gelöst* (Workaorund)

Verfasst: 27.09.2006 20:13
von AND51
Hallo!

In einem anderen Thread habe ich mein Problem mit meinem Webserver aufgedeckt.
Sehr wahrscheinlich liegt es daran, dass IE nach erhalt der Daten die Verbindung nicht von allein beendet, FireFox beispielsweise aber schon.

Wie kann ich nun prüfen, ob die Verbindung noch steht?

mein Work-drumrum:

Code: Alles auswählen

If SendNetworkData(ClientID, @buffer$, Len(buffer$)) = Len(buffer$)
	Debug "close "+Str(clientid)
	CloseNetworkConnection(ClientID)
EndIf
Ich möchte allerdings komatibel zu allen Clienten sein, nicht, dass jemand das nachfolgende Leerzeichen für einen Teil der angeforderten Daten hält. Dadurch würde beispielsweise ein Bild oder eine EXE-Datei (Downloads) unbrauchbar (oder ZIP-Dateien, oder, oder, oder). Bei HTML-Dateien wäre es nicht ganz so tragisch, aber es muss trotzdem nicht sein.

hat jemand ne Idee? Dies kommt bestimmt auch anderen zu Gute! :allright:

Verfasst: 27.09.2006 21:37
von Thorsten1867
Vielleicht hilft das weiter:

Code: Alles auswählen

; Internetverbindung überprüfen
Procedure InternetConnection() 
  If InternetGetConnectedState_(0, 0) 
    result = 1 
  Else 
    result = 0 
  EndIf 
  ProcedureReturn result 
EndProcedure

Verfasst: 27.09.2006 23:42
von mk-soft
Den Zeitpunkt des letzen Trafic für jeden Client einzeln speichern und mit eine Watchdog (z.b. max 4 Minuten) überprüfen.

Wenn die Zeit abgelaufen ist mit CloseNetworkConnection(Verbindung)
die Verbindung Serverseitig Killen.

FF :wink:

Verfasst: 28.09.2006 08:47
von AND51
@ Thorsten1867: Danke, Aber ich suche keine Möglichkeit, zu prüfen, ob eine Verbindung mit dem Internet allgemein besteht, sondern, ob ein bestimmter Client noch mit meinem Server verbunden ist.
Denn manchmal trennt sich der Client von allein und mein Programm stürzt bei dem Versuch CloseNetworkConnection() einfach ab. Lasse ich aber die Verbindung bestehen habe ich bald hunderte/tausende offener und "toter" Verbindungen.

@ mk-soft: Ich kann ja die Verbindung nicht Serverseitig trennen. Warum? Wenn ein Internet Explorer zu mir connected und wir Daten austauschen, beendet er die Verbindung NICHT (so ist das IMHO auch normal). Beispielsweise der FireFox aber beendet die Verbindung nach dem Datenaustausch selbstständig (das ist IMHO nicht normal).

@ All: Nun, wo lieg das Problem? Ganz einfach: Ich arbeite mit dem derzeit aktuellsten HTTP-Protokoll 1.1. Dieses schlägt standardmäßig vor, dass Verbindungen aufrecht erhalten bleiben (Connection: Keep-Alive). So kann ein Client mehrere Dateien anfordern ohne für jede eine neue Verbindung öffnen zu müssen, wie es in HTTP 1.0 oder gar 0.9 war.
Ich sage dem CLienten jedoch immer "Connection: Close", um zu signalisieren, dass ich nicht bereit bin, die Verbindung stehen zu lassen, der CLient soll sich 'ne neue Verbindung aufbauen, was ja auch alle brav machen. Der IE muss von mir aber gewaltsam getrennt werden, der FireFox trennt die Verbindung von sich aus.

Was soll ich jetzt machen? Darauf vertrauen, dass alle die Verbindung von allein schließen? Dann habe ich hinterher tausende tote Verbindungen (und diese zuahl ist durchaus real: Wenn der IE eine HTML-Seite läd und im HTML-Code steht, dass viele kleine Bildchen und Hintergründe, CSS-Dateien, usw. geladen werden sollen, dann wird für jede angeforderte Datei eine Verbindung geöffnet).
Oder soll ich alle Verbindungen manuell schließen? Dann schmiert das Programm sogar mit Debugger und onError Sektion kommentarlos ab :shock: , wenn die Verbindung bereits weg war.

Verfasst: 28.09.2006 13:23
von AND51
Soetwas suche ich, Leute: http://www.purebasic.fr/english/viewtop ... connection

Hat einer 'ne Idee?

Bis dahin nutze ich meinen Work-dumrum:

Code: Alles auswählen

CloseSocket_()
Der stürzt wenigstens nicht ab, wenn der Client wech ist.

Verfasst: 28.09.2006 18:13
von mk-soft
Frage:

Reagierst du auch auf "#PB_NetworkEvent_Disconnect"
Wenn nicht versucht du eine Connection zu schliessen welche bereit von der interen Verwaltung von Purebasic geschlossen wurde.

FF :wink:

P.S. Warum Trennst du immer die Vebindung Serverseitig nach den Übertragen der Daten. Der Client trennt doch die Verbindung.
Vielleicht erst nach einen Timeout den Client killen.

Aber immer auf #PB_NetworkEvent_Disconnect reagieren.

Edit:
Noch ein Link von mir:
http://www.purebasic.fr/german/viewtopi ... =varserver

Verfasst: 28.09.2006 20:19
von AND51
Du hast eigentlich Recht, aber ich hatte Bedenken:
Ich will kompatibel zu allen Clienten sein, also zum Beispiel auch zu anderen Anwendungen als Browsern.

Ich kann's eigentlich nur wiederholen: Was wenn brave Browser wie FireFox die Verbindung schön beenden, böse Browser wie der IE die Verbindung aber meist offen lassen, obwohl ich sage "Connection: Close" ?

OK, ich könnte die Verbindung bei TimeOut beenden, sofern ich das nicht mit #PB_NetworkEvent_Disconnect mitbekommen habe. Was aber, wenn solange der Brwoser auf der gegenseite stehen bleibt und auf was-auch-immer wartet? Oder wird das nicht passieren?

Verfasst: 28.09.2006 20:34
von mk-soft
Dann kommt die Nette Meldung "Server nicht Verfügbar" oder "Seite nicht erreichbar" oder so ähnlich.
Dann bekannterweise die Taste "F5" oder "Aktuelle Seite neu Laden".
All so kein Problem wenn du die Client Verbindung killst.

FF :wink:

Verfasst: 28.09.2006 22:34
von AND51
Ich werd noch mal probieren, schließlich ist dies ja ein unumgänglicher Punkt in meinem Projekt. Aber heute nicht mehr...