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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

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

Beitrag 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:
Zuletzt geändert von AND51 am 28.09.2006 14:15, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich werd noch mal probieren, schließlich ist dies ja ein unumgänglicher Punkt in meinem Projekt. Aber heute nicht mehr...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten