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?
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
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. –
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. –