none
TCP Programm, DNS Name des Servers abrufen. RRS feed

  • Frage

  • Hallo,

    ich habe nun mit einem recht einfachen Programm begonnen. Mit diesem wird die SystemZeit des Servers an alle Clients übertragen. Ich habe nun 2 Probleme:

    1.Aus irgendeinem Grund schließt sich der Server nicht. Obwohl das Ende, des Codes ereicht sein müsste...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    using System.IO;
    using System.Net.Sockets;
    using System.Collections;
    
    namespace TimeServer
    {
       public class TimeServer
        {
            private static TcpListener listener = null;
            private static ArrayList threads = new ArrayList();
           
           
    
            public static void Main(string[] args)
              
            {
                Console.WriteLine("Wilkommen. Starte....");
                listener = new TcpListener(4711);
                listener.Start();
                Thread th = new Thread(new ThreadStart(Run));
    
                th.Start();
                string cmd = "";
                while(cmd.ToLower() != "stop")
                {
                    cmd = Console.ReadLine();
                    if(cmd != "stop")
                    {
                        Console.WriteLine("Unbekannter Befehl");
                    }
                }
                foreach(TimeThread stopth in threads)
                {
                    stopth.stop = true;
                }
                    th.Abort();
                listener.Stop();
            }
            public static void Run()
            {
              
                while (true)
                {
                    Console.WriteLine("Warte auf Client.");
                    TcpClient c = listener.AcceptTcpClient();
                    Console.WriteLine("Client gefunden! Übertragung gestartet!");
                    threads.Add(new TimeThread(c));
                }
    
            }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    namespace TimeServer
    {
        class TimeThread
        {
            public bool running;
            public bool stop = false;
            private TcpClient connection = null;
            public TimeThread(TcpClient connection)
            {
                running = true;
                this.connection = connection;
                Thread th = new Thread(new ThreadStart(Run));
                th.Start();
            }
            public void Run()
            {
                running = true;
                string buf = null;
                bool loop = true;
                while (loop == true)
                {
                    String time = DateTime.Now.ToString();
                    
                    if (time != buf)
                    {
                        Byte[] sendBytes = Encoding.ASCII.GetBytes(time + "\r\n");
                        try
                        {
                            Stream outStream = connection.GetStream();
                            outStream.Write(sendBytes, 0, sendBytes.Length);
                        }
                        catch
                        {
                            connection.Close();
                            running = false;
                                                
                        }
                        buf = time;
                    }
                    if (stop == true)
                        loop = false;
                }
                if (stop == true && running == true)
                {
                    Console.WriteLine("Verbindung wird getrennt.");
                    
                    connection.Close();
                    running = false;
                }
            } 
            
            
            
        }
    }
    

    2. Das zweite beruht nicht auf einem simplen Fehler meinerseits.

    Um einen TCP Client zu erzeugen muss ich die DNS Adresse des Hostes angeben. Klar kann ich einfach die meines Pcs nehmen, wie kann ich aber auch von einem anderen Computer aus auf dieses Zugreifen?

    LG

    Samstag, 10. Oktober 2015 17:44

Antworten

  • Hallo,

    1) Ungefähr so:

    namespace TimeServer
    {
       public class TimeServer
        {
            private static TcpListener listener = null;
            private static ArrayList threads = new ArrayList();
           
           
    
            public static void Main(string[] args)
              
            {
                Console.WriteLine("Wilkommen. Starte....");
                listener = new TcpListener(4711);
                listener.Start();
                Thread th = new Thread(new ThreadStart(Run));
    
                th.Start();
                string cmd = "";
                while(cmd.ToLower() != "stop")
                {
                    cmd = Console.ReadLine();
                    if(cmd != "stop")
                    {
                        Console.WriteLine("Unbekannter Befehl");
                    }
                }
                foreach(TimeThread stopth in threads)
                {
                    stopth.stop = true;
                }
                    
                listener.Stop();
            }
            public static void Run()
            {
              
                while (true)
                {
                    Console.WriteLine("Warte auf Client.");
                    try
                    { 
                        TcpClient c = listener.AcceptTcpClient();
                    }
                    catch(SocketException ex)
                    {
                        Console.WriteLine("Server  beendet.");
                        return;
                    } 
                    if(c!=null)
                    {    
                       Console.WriteLine("Client gefunden! Übertragung gestartet!");
                       threads.Add(new TimeThread(c));
                    }
                }
    
            }
        }
    }

    2) Du kannst im Client-Programm ein Dialog programmieren, wo IP-Adresse und Port  des Servers eingegeben werden.

    Grüße

    • Als Antwort markiert R3turnz Sonntag, 11. Oktober 2015 13:02
    Sonntag, 11. Oktober 2015 08:35

Alle Antworten

  • Hallo,

    1) Beim Aufruf der Methode Abort

    th.Abort();

    wird eine ThreadAboardException ausgelöst. Weil diese Exception im Thread nicht abgefangen wird, wird das Programm (vermute ich) abgebrochen.

    Die Methode Abort ist mit Vorsicht zu genießen, weil man nicht weißt in welchem Zustand den Thread abgebrochen wird.

    2) Du kannst auch über IP Adresse auf den Server zugreifen.

    Grüße

    Samstag, 10. Oktober 2015 22:03
  • Hallo,

    1) Ich bekomme es einfach nicht hin:

    Das habe ich probiert:

    Console.WriteLine("Warte auf Client.");
                        TcpClient c = null;
    
                    if (stop == true)
                    {
                        listener.Stop();
    
    
                    }
                    else if(stop == false)
                      {
                        c = listener.AcceptTcpClient();
                        threads.Add(new TimeThread(c));
                        Console.WriteLine("Client gefunden! Übertragung gestartet!");
                    }
                }
     foreach(TimeThread stopth in threads)
                {
                    stopth.stop = true;
                    
                }
                
                stop = true;
                th.Abort();
     

    2) Wie kann ich die Clients dann auf die IP des Servers synchronisieren?

    LG

    Sonntag, 11. Oktober 2015 06:25
  • Hallo,

    1) Ungefähr so:

    namespace TimeServer
    {
       public class TimeServer
        {
            private static TcpListener listener = null;
            private static ArrayList threads = new ArrayList();
           
           
    
            public static void Main(string[] args)
              
            {
                Console.WriteLine("Wilkommen. Starte....");
                listener = new TcpListener(4711);
                listener.Start();
                Thread th = new Thread(new ThreadStart(Run));
    
                th.Start();
                string cmd = "";
                while(cmd.ToLower() != "stop")
                {
                    cmd = Console.ReadLine();
                    if(cmd != "stop")
                    {
                        Console.WriteLine("Unbekannter Befehl");
                    }
                }
                foreach(TimeThread stopth in threads)
                {
                    stopth.stop = true;
                }
                    
                listener.Stop();
            }
            public static void Run()
            {
              
                while (true)
                {
                    Console.WriteLine("Warte auf Client.");
                    try
                    { 
                        TcpClient c = listener.AcceptTcpClient();
                    }
                    catch(SocketException ex)
                    {
                        Console.WriteLine("Server  beendet.");
                        return;
                    } 
                    if(c!=null)
                    {    
                       Console.WriteLine("Client gefunden! Übertragung gestartet!");
                       threads.Add(new TimeThread(c));
                    }
                }
    
            }
        }
    }

    2) Du kannst im Client-Programm ein Dialog programmieren, wo IP-Adresse und Port  des Servers eingegeben werden.

    Grüße

    • Als Antwort markiert R3turnz Sonntag, 11. Oktober 2015 13:02
    Sonntag, 11. Oktober 2015 08:35
  • Hallo,

    noch eine letzte Frage:

    Wenn ich den Server beende, sollte ich den Client am besten ja auch ausschalten:

      if(inStream.ReadLine() == "")
                        {
                            loop = false;
                        }
    Dieser Code funktioniert aber nicht, wie kann ich das überprüfen?

    Sonntag, 11. Oktober 2015 13:20
  • Hallo,

    In deinem Fall kannst Du überprüfen, ob die Daten nach der Verbindung ankommen oder nicht. Falls die Daten eine bestimmte Zeitintervall von Server nicht ankommen, dann heißt das, dass der Server die Verbindung getrennt hat.

    Oder Du kannst dein Kommunikationsprotokoll mit einem zusätzlichen Telegramm  für das Beenden der Verbindung erweitern.

     

    Grüße     

    Montag, 12. Oktober 2015 10:29