2012-04-05 12 views
2

Ich habe eine Delphi 6-Anwendung, die mit einem externen Gerät spricht, das als HTTP-Server fungiert. Ich verwende die ICS TWSocket-Komponenten für diese Anwendung. Ich öffne einen Sockel, um mit dem Gerät zu sprechen und den notwendigen Header und Body Crafting zu handhaben, um mit dem Server zu sprechen. Mit anderen Worten, ich verwende nicht die ICS-HTTP-Client-Komponente, sondern benutze die TWSocket-Komponente der unteren Ebene und handle selbst mit dem notwendigen HTTP- "Handshaking".Was könnte dazu führen, dass ein Socket nach jeder HTTP-Transaktion schnell geschlossen wird?

Die Header, die ich fertige und an das externe Gerät sende, haben das Keep-Alive-Flag auf TRUE gesetzt. Nachdem ich etwas an das externe Gerät gesendet habe, bleibt die Verbindung auf meinem System kontinuierlich geöffnet und wird erst geschlossen, wenn ungefähr 30 Sekunden Inaktivität auftreten (30 Sekunden, in denen ich keine Anforderungen an das externe Gerät als HTTP-Server stelle). . Ich weiß nicht, ob das externe Gerät es schließt oder ob Microsoft Windows es tut. Aber der wichtige Punkt ist, dass ich normalerweise mehrere Sends machen kann und die Verbindung bleibt offen, bis ich für etwa 30 Sekunden nichts sende. Das funktioniert gut und das erwartet mein Code.

Jedoch auf einigen meiner Benutzer-Systeme schließt die Steckdose nach jedem senden. Ich habe Code, der nach einem geschlossenen Socket sucht und bei Bedarf eine erneute Verbindung mit dem externen Gerät versucht, aber nicht erwartet, dass eine erneute Verbindung mit jeder Transaktion erforderlich ist.

Meine Fragen sind:

  • Gibt es eine Systemeinstellung für Steckdosen, die bei einigen Benutzern Systeme dieses anomale Verhalten verursachen könnte?

  • Wenn ja, gibt es Windows-API-Funktionsaufrufe, die ich verwenden kann, um den fehlerhaften Parameter abzufragen und ihn dann auf den erwarteten Abschluss von 30 Sekunden Inaktivität anstelle von jeder Transaktion zu setzen?

  • Wenn ja, kann ich oder wie mache ich das so, dass andere Programme, die auf dem Benutzersystem ausgeführt werden, nicht beeinträchtigt werden?

+0

das externe Gerät ist immer die gleiche Version, mit der gleichen Konfiguration und nicht über eine Art von Proxy verbunden?Weil es scheint, dass Unterschiede entweder durch verschiedene Server oder etwas in der Mitte verursacht werden. – mjn

+4

Das könnte nur HTTP/1.0 sein, das auf diesem bestimmten Gerät läuft. Version 1.0 hatte keine dauerhaften Verbindungen. Wie auch immer, wireshark ist dein Freund. –

+0

Bitte verwenden Sie zuerst Microsoft Network Monitor oder Wireshark, um zu sehen, wie die Verbindung geschlossen wird (welche Seite sendet das TCP-RESET), und dann können Sie die Analyse weiter starten. –

Antwort

6

Der Server schließt den Socket. Es gibt drei mögliche Gründe:

  • Der Kunde hat eine HTTP/1.0 Anfrage
  • Der Client setzt einen Connection: close-Header in der Anfrage
  • Der Server keine persistenten Verbindungen unterstützt

HTTP/1.0 unterstützte persistente Verbindungen nicht, und der Server wäre beim Schließen des Sockets nach einer HTTP/1.0-Anforderung korrekt.

HTTP/1.1 gibt an, dass eine Verbindung implizit dauerhaft ist, es sei denn, der Client gibt einen Connection: close Header an. Der Server wäre beim Schließen der Verbindung korrekt, wenn er diesen Header erhält. Wenn der Server keine persistenten Verbindungen unterstützt, wäre es auch korrekt, die Verbindung zu schließen.

Wenn Sie HTTP/1.1 verwenden, können Sie erzwingen, dass die Verbindung dauerhaft ist (sofern der Server dies unterstützt), indem Sie einen Header Connection: keep-alive senden. Sie sollten dann auch einen Keep-Alive: timeout=<secs>, max=<max-requests> Header senden, wobei <secs> und <max-requests> ganze Zahlen sind, die das gewünschte Verhalten darstellen.

+2

Für HTTP 1.0 kann ein Client einen Anforderungsheader "Verbindung: Keep-Alive" senden, um nach einer dauerhaften Verbindung zu fragen. Die meisten HTTP 1.0-Server unterstützen dies als inoffizielle Erweiterung, da 'keep-alive' in HTTP 1.0 nicht standardmäßig aktiviert ist. Der "Connection" -Antwort-Header des Servers zeigt an, ob der Keep-Alive eingehalten wurde oder nicht. –

+0

@DaveRandom - bitte sehen Sie meinen Kommentar unten und Remy danke. –

+0

@RemyLebeau (und Dave) - Der Server scheint laut Antwortkopf HTTP 1.0 zu sein: "HTTP/1.0 200 OK" + "Server: WYM/1.0". Ich hatte immer die "Verbindung: Keep-Alive" -Linie, aber nur eine "Keep-Alive-Timeout = 30 max = 3" Zeile zu meiner Anfrage hinzugefügt. Der Server gibt die folgenden Zeilen im Antwortheader mit dem Status 200 OK zurück: "Verbindung: Keep-Alive" + "Keep-Alive: Zeitüberschreitung = 3600, max = 108000". Zeigt das (unbedingt) trotz der Unterstützung von HTTP 1.0 Erfolg? Ich habe jedoch die Debug-Protokolle vom Benutzer überprüft, und diese beiden Keep-Alive-Zeilen kommen tatsächlich vom Server zurück. –

Verwandte Themen