Ich benutze HAProxy, das alle 10 Sekunden einen Gesundheitscheck sendet.
Es geht folgendermaßen:
%Vor%Mein TCP-Server wird auf folgende Weise in Java geschrieben:
%Vor% In Windows 7 kehrt accept()
nach diesem Austausch nicht zurück (es kehrt nach dem regulären syn- & gt; ack- & gt; syn-Handshake zurück), und das ist es, was ich brauche.
Wenn die Anwendung jedoch auf Windows Server 2012 ausgeführt wird, gibt accept()
function das erste [SYN]
zurück, das von HAProxy gesendet wird, und führt die kostspielige Operation aus.
Ich habe also 2 Fragen:
Ist dieses Verhalten konfigurierbar?
Wenn ich nicht auf das erste Bit oder die Nachricht warten möchte, bevor ich den Listener starte, wie kann ich die Verbindung von HAProxy auf Windows 2012 erkennen?
BEARBEITEN:
Darf es unter Windows mit dem ATM TCP / IP verbunden sein?
Wenn Sie die Funktion accept verwenden, stellen Sie sicher, dass die Funktion zurückkehren kann bevor der Verbindungsaufbau die gesamte Strecke zurückgelegt hat zwischen Sender und Empfänger. Dies ist, weil die Annahme-Funktion gibt zurück, sobald es eine CONNECT ACK-Nachricht erhält; in ATM, a Die CONNECT ACK-Nachricht wird vom nächsten Switch im Pfad alsbald zurückgegeben wenn eine CONNECT-Nachricht verarbeitet wird (und nicht die CONNECT ACK-Nachricht) gesendet von dem Endknoten, mit dem die Verbindung letztendlich verbunden ist etabliert). Als solche sollten Anwendungen erkennen, dass wenn Daten sind gesendet unmittelbar nach Erhalt einer CONNECT ACK Nachricht, Datenverlust ist möglich, da die Verbindung möglicherweise nicht alle hergestellt wurde der Weg zwischen Sender und Empfänger.
Siehe Wie funktioniert die Funktion accept () der Socket-API?
Von Ссылка Es scheint, dass dies das erwartete Verhalten ist, da HAproxy den Socket zum Client öffnet, um ihn an den anderen Rechner zu leiten.
Das Problem ist, dass HAproxy TCP-kompatibel ist:)
Eine Problemumgehung sollte darin bestehen, mit der Ausführung Ihrer Logik zu beginnen, nachdem einige Logik vom Server überprüft wurde (z. B. wurde eine kleine Nachricht gesendet und ein ACK wurde über den Socket empfangen).