AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy TCP - Warten bis die Gegenseite zugemacht hat
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP - Warten bis die Gegenseite zugemacht hat

Ein Thema von Der schöne Günther · begonnen am 5. Mär 2018 · letzter Beitrag vom 7. Mär 2018
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Indy TCP - Warten bis die Gegenseite zugemacht hat

  Alt 5. Mär 2018, 20:10
Ich bin kein Netzwerkprofi. Deswegen bin ich verwirrt.

Ich habe einen Indy (TIdTcpClient ), nennen wir ihn A und die Gegenseite B. Ich baue die Verbindung ab indem ich sage client.Disconnect(True); In Wireshark sehe ich (von oben nach unten):

Code:
+========+=============+===========+
| Source | Destination | TCP-Flags |
+========+=============+===========+
| A      | B           | FIN, ACK  |
+--------+-------------+-----------+
| B      | A           | ACK       |
+--------+-------------+-----------+
|  tcpClient.Connected() = false   |
+--------+-------------+-----------+
| B      | A           | FIN, ACK  |
+--------+-------------+-----------+
| A      | B           | ACK       |
+--------+-------------+-----------+
Mein Problem an der Sache:

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?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

AW: Indy TCP - Warten bis die Gegenseite zugemacht hat

  Alt 6. Mär 2018, 08:06
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Indy TCP - Warten bis die Gegenseite zugemacht hat

  Alt 6. Mär 2018, 08:26
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.
Michael Justin
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Indy TCP - Warten bis die Gegenseite zugemacht hat

  Alt 6. Mär 2018, 08:49
.. gab es bei den Indy Libraries nicht auch ein CloseGracefully?



Delphi-Quellcode:
TCPClient.IOHandler.InputBuffer.Clear;
TCPClient.IOHandler.CloseGracefully;
TCPClient.Disconnect;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Indy TCP - Warten bis die Gegenseite zugemacht hat

  Alt 6. Mär 2018, 08:57
Letztendlich ruft ein Disconnect (unter Windows) diesen Code auf:

Delphi-Quellcode:
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;
Durch das CloseSocket ist das Socket Handle ungültig (MSDN: "The closesocket function closes a socket. Use it to release the socket descriptor passed in the s parameter. Note that the socket descriptor passed in the s parameter may immediately be reused by the system as soon as closesocket function is issued. As a result, it is not reliable to expect further references to the socket descriptor passed in the s parameter to fail with the error WSAENOTSOCK.").

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.
Michael Justin

Geändert von mjustin ( 6. Mär 2018 um 10:22 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Indy TCP - Warten bis die Gegenseite zugemacht hat

  Alt 7. Mär 2018, 11:45
Vielen Dank für die Antworten!

Letztendlich ruft ein Disconnect (unter Windows) diesen Code auf
[...]
Durch das CloseSocket ist das Socket Handle ungültig [...]
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.
Wenn ich mich an die Microsoft-Doku halte, dann gehört zwischen Shutdown und CloseSocket dass man wartet dass die Gegenseite auch zumacht. Indy zieht einfach den Stecker.

https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

oder

Zitat:
Call shutdown with how=SD_SEND.
Call recv or WSARecv until the function completes with success and indicates zero bytes were received. If SOCKET_ERROR is returned, then the graceful disconnect is not possible.
Call closesocket.
Quelle


.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

Geändert von Der schöne Günther ( 7. Mär 2018 um 18:19 Uhr) Grund: c# code eingekürzt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz