Laden...

Wieso bleibt AcceptTcpClient beim TCP Listener hängen?

Erstellt von ado683 vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.868 Views
A
ado683 Themenstarter:in
27 Beiträge seit 2019
vor 5 Jahren
Wieso bleibt AcceptTcpClient beim TCP Listener hängen?

Hallo leut,
nächstes Problem 😁

in dem TCP Listener hängt er sich ab dem Befehl

TcpClient client = server.AcceptTcpClient();

(erster Befehl in der while Schleife auf).

Dh er geht nicht in den Befehl danach, auch wenn ich breakpoints setze bringt es mir nichts, denn er kommt da einfach nicht raus.


public class MyTcpListener
    {
        public static void Connect(string ipAdd, string port1, TextBox textBox_MessageToReceive)
        {
            System.Diagnostics.Debug.WriteLine("vor try");

            TcpListener server = null;
            try
            {
                
                //Console.WriteLine("test");
                System.Diagnostics.Debug.WriteLine("im Try-Block");

                // Set the TcpListener on port 13000.
                Int32 port = Int32.Parse(port1);
                IPAddress ip = IPAddress.Parse(ipAdd);

                System.Diagnostics.Debug.WriteLine("Waiting for a connection... ");

                // TcpListener server = new TcpListener(port);
                server = new TcpListener(ip, port);

                // Start listening for client requests.
                server.Start();

                // Buffer for reading data
                Byte[] bytes = new Byte[256];
                String data = null;

                // Enter the listening loop.
                while (true)
                {

                    // Perform a blocking call to accept requests.
                    // You could also user server.AcceptSocket() here.
                    TcpClient client = server.AcceptTcpClient();
                    System.Windows.MessageBox.Show("Connected!");
                   

                    data = null;

                    // Get a stream object for reading and writing
                    NetworkStream stream = client.GetStream();

                    int i;

                    // Loop to receive all the data sent by the client.
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        // Translate data bytes to a ASCII string.
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        Console.WriteLine("Received: {0}", data);

                        // Process the data sent by the client.
                        data = data.ToUpper();

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

                        // Send back a response.
                        stream.Write(msg, 0, msg.Length);
                        Console.WriteLine("Sent: {0}", data);
                    }

                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
                Console.ReadKey();
            }
            finally
            {
                // Stop listening for new clients.
                server.Stop();
            }
            

            Console.WriteLine("\nHit enter to continue...");
            Console.Read();
        }
    }

please help

16.827 Beiträge seit 2008
vor 5 Jahren

Hatten wir hier im Forum schon ca. 864334 mal:

Wie Du der Dokumentation entnehmen kannst, ist AcceptTcpClient eine blockierende Methode.
Diese blockt solange, bis sich ein Client verbindet - und blockt danach wieder.
Das steht sogar in Deinem Code Kommentar! Code etwa blind kopiert? 😉

Ergo: asynchron programmieren und die asynchrone Methode verwenden, wie es auch in der Dokumentation verwiesen ist.

PS: auch Du darfst sehr gerne in Zukunft einen Titel wählen, der aussagekräftig ist und das Thema im richtigen Forenbereich posten 🙂
[Hinweis] Wie poste ich richtig?

Edit:
PPS: ich sehe gerade Du hast den Code sogar 1:1 von der Microsoft Docs Dokumentation kopiert - offenbar ohne den dortigen Hinweis zu lesen 👍 👍

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

wenn ich aber die Zeile rausnehme und versuche asynchron zu machen gibt er mir folgende exception aus:

System.NotImplementedException: Die Methode oder der Vorgang ist nicht implementiert.
bei WpfApp2.MyTcpListener.AcceptTcpClientAsync() in C:\Development\cp50_Applications\DesiteRemote\dotNET\MyTcpListener.cs:Zeile 100.
bei WpfApp2.MyTcpListener.<ConnectAsync>d__0.MoveNext() in C:\Development\cp50_Applications\DesiteRemote\dotNET\MyTcpListener.cs:Zeile 49.

obwohl ich das hier implementiert habe


private static Task<TcpClient> AcceptTcpClientAsync()
        {
            throw new NotImplementedException();
        }

WTF?!

16.827 Beiträge seit 2008
vor 5 Jahren

Liest Du Dir Dein Code, den Du schreibst, selbst durch?
Wenn Du eine NotImplementedException schreibst, dann ist klar, dass eine System.NotImplementedException geworfen wird..... dafür ist es da.

Darüber hinaus musst Du nichts selbst implementieren, sondern einfach die entsprechende Methode aufrufen.
Wirkt als ob Du extrem chaotisch an die Sache gehst.. ich weiß nicht, wie man Dir da helfen soll.

T
461 Beiträge seit 2013
vor 5 Jahren

Wirkt als ob Du extrem chaotisch an die Sache gehst.. ich weiß nicht, wie man Dir da helfen soll.

Haha, das erinnert mich manchmal an mich selbst 😁

Zunächst sollte er mal den oberen (kopierten) code kapieren, bevor er mit asynchronität dazwischenfunkt und sich am Ende noch weniger auskennt 😉

Also zurück zum 1. Beitrag, hast du es geschafft den gesamten Code zu verstehen oder hängt es da noch irgendwo im Verständnis?

:rtfm:

SG Thomas

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

3.170 Beiträge seit 2006
vor 5 Jahren

Hallo,

statt den Code irgendwo unbesehen herzukopieren, und sich dann wundern, dass es nicht 1:1 im eigenen Kontext funktioniert, könntest Du Dir erst mal [FAQ] TcpClient: einfaches Beispiel anschauen - nein, nicht nur anschauen, auch durchlesen 😉 - und versuchen, das dort Geschriebene zu verstehen.
Danach solltest Du ein Grundverständnis dafür haben, wie Netzwerkkommunikation funktioniert.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

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

das Problem ist ich bin gerade neu im Praktikum.

Und habe in meiner Umschulung bis jetzt nur Grundlagen gemacht und jetzt komme ich hierhin und mir wird ein fertiges voriges Programm in C++ gegeben, welches ich in C#
umschreiben soll.

Und da sind halt dinge drin von denen ich vorher nie gehört habe. Wie zB TcpListener, BackgroundWorker, Async usw

Und selbst wenn ich mit meinem hier zuständigen Ausbilder rede, stehen die oft vor Fragezeichen.

Keine Ahnung wo das noch hinführen soll