![]() |
Indy TCP - Warten bis die Gegenseite zugemacht hat
Ich bin kein Netzwerkprofi. Deswegen bin ich verwirrt.
Ich habe einen Indy (
Delphi-Quellcode:
), nennen wir ihn A und die Gegenseite B. Ich baue die Verbindung ab indem ich sage
TIdTcpClient
Delphi-Quellcode:
In Wireshark sehe ich (von oben nach unten):
client.Disconnect(True);
Code:
Mein Problem an der Sache:
+========+=============+===========+
| Source | Destination | TCP-Flags | +========+=============+===========+ | A | B | FIN, ACK | +--------+-------------+-----------+ | B | A | ACK | +--------+-------------+-----------+ | tcpClient.Connected() = false | +--------+-------------+-----------+ | B | A | FIN, ACK | +--------+-------------+-----------+ | A | B | ACK | +--------+-------------+-----------+ Aus Delphi/Indy-Sicht ist die Verbindung schon geschlossen nachdem ich mein FIN abgesetzt habe. Ich möchte allerdings noch bewusst warten bis die Gegenseite auch FIN gesagt hat, denn ich bin höflich. Wie mache ich das? |
AW: Indy TCP - Warten bis die Gegenseite zugemacht hat
Da wirst Du wohl selbst die Indys nachbauen müssen. Melde Dich, wenn Du fast fertig bist. Alternativ kannst Du einen Bug Report bei denen auf machen.
Hast Du mal in die ICS von Francois Piette reingeschaut? Die sind IMHO delphischer als die Indys. Sherlock |
AW: Indy TCP - Warten bis die Gegenseite zugemacht hat
Hinter den Indy Kommandos stehen die Windows API Funktionen - daher würde ich zuerst einmal weiter in das Disconnect hinein schauen (oder debuggen) um zu erkennen welche API Funktion dort benutzt wird.
|
AW: Indy TCP - Warten bis die Gegenseite zugemacht hat
.. gab es bei den Indy Libraries nicht auch ein CloseGracefully?
Delphi-Quellcode:
Grüße
TCPClient.IOHandler.InputBuffer.Clear;
TCPClient.IOHandler.CloseGracefully; TCPClient.Disconnect; Klaus |
AW: Indy TCP - Warten bis die Gegenseite zugemacht hat
Letztendlich ruft ein Disconnect (unter Windows) diesen Code auf:
Delphi-Quellcode:
Durch das CloseSocket ist das Socket Handle ungültig (
procedure TIdStackWindows.Disconnect(ASocket: TIdStackSocketHandle);
begin // Windows uses Id_SD_Send, Linux should use Id_SD_Both WSShutdown(ASocket, Id_SD_Send); // SO_LINGER is false - socket may take a little while to actually close after this WSCloseSocket(ASocket); end; ![]() Dadurch kann man nach dem Schliessen nicht mehr sinnvoll auf das Socket Handle zugreifen. Der Client kann daher auch nicht mehr prüfen, ob noch irgendetwas vom Server gesendet wird. Die TCP Pakete sieht man allerdings auch sonst nicht. Mit Indy (oder anderen TCP Bibliotheken die auf Winsock basieren) kommt man daher nicht weiter. |
AW: Indy TCP - Warten bis die Gegenseite zugemacht hat
Vielen Dank für die Antworten!
Zitat:
![]() oder Zitat:
![]() .net kann das doch auch, warum kann ich mit Delphi/Indy noch nicht mal einen TCP-Socket vernünftig schließen?
Code:
using System;
using System.Net.Sockets; namespace ConsoleApplication1 { class Program { const String ipAddress = "192.168.86.116"; const ushort portNo = 502; static void TestReconnect() { Socket socket = new TcpClient().Client; socket.Connect(ipAddress, portNo); socket.Disconnect(reuseSocket : true); // bei false ist das Verhalten wie bei Delphi/Indy } static void Main(string[] args) { TestReconnect(); TestReconnect(); Console.WriteLine("end."); Console.ReadLine(); } } } Ich schaue mir mal ICS an. Sonst kenne ich keine Alternativen zu Indy :evil: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz