Benutzer mit den meisten Antworten
C# WPF: Nachricht an Remote via Socket

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
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
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
-
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
-
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