none
C# WPF: Nachricht an Remote via Socket RRS feed

  • Frage

  • Hallo, ich möchte über einen Socket eine Nachricht an anderen Computer im Netzwerk schicken. Mein Programm ist noch nicht vollständig, da ich auf eine Fehlermeldung gestoßen bin und nicht mehr weiter weiß.

    Fehlermeldung vom Typ SocketException: "Eine vorhandene Verbindung wurde vom Remotehost geschlossen"

    Hinweis: Firewall ist aus. Ich versuche zunächst die empfangene Nachricht im eigenen Rechner auszugeben, in dem ich über den Rechnernamen die IP auflöse und die Nachricht schicke. Eine Verbindung wird aufgebaut und auch Daten werden geschickt. Die Fehlermeldung erscheint beim Empfangen der Nachricht, sprich in der Zeile wo Receive verwendet wird.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Text.RegularExpressions;
    using System.Net;
    using System.Net.Sockets;
    using System.Web;
    
    namespace Benachrichtigung
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            Socket sck;
            EndPoint ep_remote;
            Nachricht nachricht;//Childwindow zur Ausgabe der empfangenen Nachricht
    
            public MainWindow()
            {
                InitializeComponent();
    
            }
    
            private void ButtenSenden_Click(object sender, RoutedEventArgs e)
            {
                string remote_ip = "";
                if(TextBoxRemote.Text != ""){
                    try
                    {
                        bool containsletter = Regex.IsMatch(TextBoxRemote.Text, "[a-zA-Z]");
                        if (containsletter)
                        {//Remote-IP über Hostname herausfinden
                            IPHostEntry host_eintrag = Dns.GetHostEntry(TextBoxRemote.Text);
                            foreach (IPAddress ip in host_eintrag.AddressList)
                            {
                                if (ip.AddressFamily == AddressFamily.InterNetwork)
                                {
                                    remote_ip = ip.ToString();
                                }
                            }
                        }
                        else
                        {
                            remote_ip = TextBoxRemote.Text;
                        }
    
                        //Empfänger Endpunkt bestimmen (IP-Adresse, Port)
                        ep_remote = new IPEndPoint(IPAddress.Parse(remote_ip), 9000);
                        //Verbindung mit Remotehost herstellen
                        sck.Connect(ep_remote);
    
                        if (sck.Connected)
                        {
                            ListBoxAnzeige.Items.Add("connected to: " + remote_ip);
    
                            //Nachricht senden
                            String mydata= "Hello there!";
                            byte[] byData = System.Text.Encoding.ASCII.GetBytes(mydata);
                            int bs= sck.Send(byData,SocketFlags.None);
    
                            ListBoxAnzeige.Items.Add(bs+" bytes sent");
                            //Nachricht empfangen
                            byte[] buffer = new byte[1000];
                            int iRx = sck.Receive(buffer,SocketFlags.None);
                            if (iRx > 0)
                            {                            
                                nachricht = new Nachricht();
                                nachricht.main_window_ref = this;
                                nachricht.ShowDialog();
                                nachricht.TextBoxNachricht.Text = System.Text.Encoding.ASCII.GetString(buffer);
                            }
                            else
                                nachricht.TextBoxNachricht.Text = "Keine Nachricht da";
                        }
                    }
                    catch(Exception ex){
                        MessageBox.Show(ex.ToString());
                    }
    
                }
            }
    
            private void Window_Loaded_1(object sender, RoutedEventArgs e)
            {
                //erstellen eines Sockets
                sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    
            }
        }
    }

    Wäre für Tipps dankbar



    • Bearbeitet spry64 Donnerstag, 24. September 2015 11:56
    Donnerstag, 24. September 2015 11:26

Antworten

  • Hallo,

    Du initialisierst deinen Socket als UDP Socket. UDP ist ein verbinungsloses Netzwerkprotokoll. Du brauchst noch einen Listener für den Datenempfang. 

    Für die UDP- Datenübertragung kannst Du auch UDPClient verwenden.

    Grüße


    • Als Antwort markiert spry64 Sonntag, 27. September 2015 22:05
    • Bearbeitet Iso7 Montag, 28. September 2015 09:40
    Donnerstag, 24. September 2015 12:43

Alle Antworten

  • Hallo,

    Du initialisierst deinen Socket als UDP Socket. UDP ist ein verbinungsloses Netzwerkprotokoll. Du brauchst noch einen Listener für den Datenempfang. 

    Für die UDP- Datenübertragung kannst Du auch UDPClient verwenden.

    Grüße


    • Als Antwort markiert spry64 Sonntag, 27. September 2015 22:05
    • Bearbeitet Iso7 Montag, 28. September 2015 09:40
    Donnerstag, 24. September 2015 12:43
  • Hallo,

    Du initialisierst deinen Socket als UDP Socket. UDP ist ein verbinungsloses Netzwerkprotokoll. Du brauchst noch einen Listener. 

    Für die UDP- Datenübertragung kannst Du UDPClient verwenden.

    Grüße

    Hallo Iso7, danke erstmal für die Antwort. Das mit dem Listener hat mir geholfen. Wenn ich dieses Beispiel UDPListener als Konsolenanwendung laufen lasse, funktioniert alles reibungslos, aber mit WPF ergibt sich da ein Problem, und zwar, dass die Ausgabe garnicht erfolgt. Wenn ich z.b. das hier versuche

    ...           
    	try
                {
                    while (!done)
                    {
                        TextBoxNachricht.Text = "Warte auf Nachricht...\n";
                        byte[] bytes = listener.Receive(ref groupEP);
    
                        TextBoxNachricht.Text = "Erreichte Nachricht von:" +
                            groupEP.ToString()+"\n"+Encoding.ASCII.GetString(bytes, 0, bytes.Length);
                    }
    
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
    ...

    Wird garnichts ausgegeben.

    Was wäre da die Lösung? Bin Anfänger und habe mit WPF so meine Probleme


    • Bearbeitet spry64 Sonntag, 27. September 2015 19:31
    Sonntag, 27. September 2015 19:31
  • Hallo,

    Die Ausführung des Threads wird in der Methode Receive blockiert,  bis ein Telegramm vom Server eintrifft.  Um die Blockierung  des GUI Threads  zu vermeiden,  soll die Empfangsmethode in einem separatem Thread ausführt werden.  

    Die empfangene Daten können mit Hilfe von Dispatcher an GUI Thread weitergeleitet werden und in einem Control angezeigt werden.  

    Grüße

    Montag, 28. September 2015 08:45