Laden...

Socket Verbindung zeigt Nachricht erst nach einer Sekunde Verzögerung an

Erstellt von ado683 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.333 Views
A
ado683 Themenstarter:in
27 Beiträge seit 2019
vor 5 Jahren
Socket Verbindung zeigt Nachricht erst nach einer Sekunde Verzögerung an

Hallo zusammen,

ich habe eine Socket Verbindung über eine IP und einen Port aufgebaut und versende darüber eine Nachricht, welches ein andere Programm empfängt.

Dies funktioniert auch, jedoch gibt es eine Kleinigkeit die ich gerne ändern würde.

Wenn ich die Nachricht versende geschieht folgendes:

Ich verschicke zb:
in Visual Studio anderes Program Message Box Ausgabe

Hello World Hello World
blabla (es wird noch die alte Nachricht 'Hello World' angezeigt, dann nach ca. 1 sek.
Verzögerung)
blabla

  1. Warum ist das so?
  2. Und wie kriege ich es hin das, sofort die neue Nachricht gezeigt wird? Muss ich den Socket flushen, wenn ja wie geht das?

thx

709 Beiträge seit 2008
vor 5 Jahren

Hallo ado683,
ich habe deinen Text jetzt 3x gelesen und frage mich immer noch, was du damit sagen willst.
Kannst du das bitte noch einmal verständlicher ausführen?

Zum Flush: Den gibt es meines Wissens nur, wenn du mit dem NetworkStream arbeitest.

Wie rufst du denn die Daten ab?

A
ado683 Themenstarter:in
27 Beiträge seit 2019
vor 5 Jahren

die Daten werden in ein byte [] geschrieben und per ASCII decodiert. dann werden diese daten gesendet und wenn das andere programm die daten bekommen hat, wird es in einer messagebox ausgegeben (NICHT IN VISUAL STUDIO IN DEM ANDEREN PROGRAMM).

wenn ich jetzt neue daten schicke, kriege ich die auch richtig angezeigt aber erst nach einer verzögerung UND während dieser verzögerung sehe ich noch die alten daten in der offenen messagebox.

verstanden?

16.806 Beiträge seit 2008
vor 5 Jahren

Vielleicht postest Du Code, damit man sehen kann, was Du meinst.
Erklärung ist wirklich nicht einfach zu verstehen...

A
ado683 Themenstarter:in
27 Beiträge seit 2019
vor 5 Jahren
public void SendMessage(IPAddress ip, Int32 port, string message)
        {
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream,     ProtocolType.Tcp);
            IPAddress ipAddress = ip;
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

            

            try
            {
                sender.Connect(remoteEP);

                byte[] msg =System.Text.Encoding.ASCII.GetBytes(message);

                sender.Send(msg);

                sender.Disconnect(false);
                
                sender.Close();
                
            }
            catch (ArgumentNullException ane)
            {
                Console.WriteLine("ArgumentNullException : {0}", ane);
            }
            catch (SocketException se)
            {
                Console.WriteLine("SocketException : {0}", se);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception : {0}", e);
            }

            
        }
16.806 Beiträge seit 2008
vor 5 Jahren

Es würde gut tun, wenn Du ein Tutorial durchmachen würdest damit Du auch das Zeug dahinter versteckst.
Das würde Dir auch bezüglich Deinen anderen Themen hier helfen - und Du würdest schneller voran kommen.
Das Erlernen von Grundlagen können wir Dir nicht abnehmen. Diese sind aber wichtig; und fehlen hier fachlich wie auch sachlich 😉

Datenpakete haben eine fixe Größe, weshalb versucht wird das so effizient wie möglich zu halten; besonders wenn Daten übertragen werden sollen, die potentiell kleiner sind als die maximale Größe des Bodys eines Pakets.
Daher haben Sockets ein Delay, damit - wenn Du viele Send() auslöst - dessen Versand auch effizient abläuft, indem die Paketgröße optimal genutzt wird.

Über die SocketOption ist der Delay konfigurierbar.

PS: dass SendMessage einen Socket eröffnet ist zudem sehr ineffizient.
Zuerst die Verbindung öffnen, dann eine potentielle Vielzahl von Messages senden, und dann schließen.
Für jede Message eine Verbindung eröffnen ist nicht nur logisch sehr unsinnig.