Laden...

UWP Socket Client empfängt keine Daten.

Erstellt von Acer90 vor 8 Jahren Letzter Beitrag vor 7 Jahren 2.528 Views
A
Acer90 Themenstarter:in
12 Beiträge seit 2015
vor 8 Jahren
UWP Socket Client empfängt keine Daten.

Hallo liebe Community,

Das ist mein erster versuch mit UWP (Universal) leider musste ich feststellen das das senden/empfangen nun nur noch Asynchron funktionier.

Mein Test Code (WPF) funktionierte Tadellos:


using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Net.Sockets;
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;

namespace SocketClient
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public class LoggingView
        {
            public int ID { get; set; }
            public string Time { get; set; }
            public string Log { get; set; }
            public SolidColorBrush Color { get; set; }
        }

        public static ObservableCollection<LoggingView> LogItems { get; set; }
        public static int logid = 0;
        public Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        public byte[] bytes = new byte[1024];

        public MainWindow()
        {
            InitializeComponent();
            try
            {
                LogItems = new ObservableCollection<LoggingView>();
                LogListView.ItemsSource = LogItems;

                AddLog("Starte Socket Server");
                const int Port = 1234;
                const string IPv4 = "100.1.2.21";

                IPAddress ipo = IPAddress.Parse(IPv4);
                IPEndPoint ipEo = new IPEndPoint(ipo, Port);

                sock.Connect(ipEo);

                // Prüfe ob eine Verbindung besteht?
                if (sock.Connected)
                {
                    AddLog("Verbunden -> " + IPv4 + ":" + Port.ToString());
                }
            }
            catch (Exception ex)
            {
                AddLog(ex.ToString(), 3);
            }
        }

        public static void AddLog(string Log, int Logtype = 1)
        {
            logid = LogItems.Count() + 1;
            int r, g, b;
            switch (Logtype)
            {
                case 1:
                    r = 212;
                    g = 212;
                    b = 212;
                    break;
                case 2:
                    r = 255;
                    g = 255;
                    b = 0;
                    break;
                case 3:
                    r = 255;
                    g = 69;
                    b = 0;
                    break;
                default:
                    r = 212;
                    g = 212;
                    b = 212;
                    break;
            }
            LogItems.Add(new LoggingView() { ID = logid, Time = DateTime.Now.ToString("HH:mm:ss"), Log = Log, Color = new SolidColorBrush(Color.FromRgb((byte)Convert.ToInt32(r), (byte)Convert.ToInt32(g), (byte)Convert.ToInt32(b))) });
        }

        private void send_Click(object sender, RoutedEventArgs e)
        {
            if (!String.IsNullOrEmpty(textBox.Text))
            {
                try
                {
                    AddLog("Sende Daten -> " + textBox.Text);

                    Byte[] bytesSent = Encoding.ASCII.GetBytes(textBox.Text);
                    // Lege ein Byte Array an für die zu emfangenden Daten
                    Byte[] bytesReceived = new Byte[1024];

                    int i = sock.Send(bytesSent, bytesSent.Length, SocketFlags.None);

                    Int32 bytes = sock.Receive(bytesReceived, bytesReceived.Length, 0);

                    string returndata = Encoding.ASCII.GetString(bytesReceived, 0, bytes);
                    //MessageBox.Show(returndata);



                    AddLog("Server Antwortet ->" + returndata);


                    textBox.Text = "";
                    textBox.Focus();
                }
                catch (Exception ex)
                {
                    AddLog(ex.ToString(),3);
                }
                
            }
        }
    }
}

Leider kann ich aber mit dieser Vorlage:
https://msdn.microsoft.com/de-de/library/windows/apps/hh202858(v=vs.105).aspx

keine Daten vom Server empfangen, Daten werden aber an den Server gesendet.
Ich bekomme als Ausgabe: Operation Timeout

Weil er scheinbar bei diesen Code:

public string Receive()
        {
            string response = "Operation Timeout";
            if (_socket != null)
            {
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

                socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
                {
                    if (e.SocketError == SocketError.Success)
                    {
                        response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                        response = response.Trim('\0');
                    }
                    else
                    {
                        response = e.SocketError.ToString();
                    }

                    _clientDone.Set();
                });
                _clientDone.Reset();
                _socket.ReceiveAsync(socketEventArg);
                _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
            }
            else
            {
                response = "Socket is not initialized";
            }

            return response;
        }

den Teil ab socketEventArg.Completed überspringt.

Ich bin auch schon seit 2 Stunden am googeln hab aber noch nichts gefunden.

Danke für eure Hilfe.

mfg: Acer

16.842 Beiträge seit 2008
vor 8 Jahren

XAML - auch unter UWP - sollte immer mit dem MVVM Pattern umgesetzt werden.
Du mischt hier alles extrem.
[Artikel] Drei-Schichten-Architektur

Asynchrone Programmierung ist pflicht in Apps; das ist auch gut so.
Du musst die jeweils asynchronen Methoden verwendet.

Deine Ausgabe definierst Du doch selbst.

 string response = "Operation Timeout";

Sehr wahrscheinlich wird eben der Timeout durch WaitOne() erreicht und bricht damit ab.

Kannste ja alles debuggen.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

A
Acer90 Themenstarter:in
12 Beiträge seit 2015
vor 8 Jahren

He danke du hast mich auf eine Idee gebracht,

hab den Fehler gefunden lag am Server.

mfg: Acer

p.s. noch schöne Ostern

K
1 Beiträge seit 2016
vor 7 Jahren

Wärst du so gütig und würdest deine finale Lösung posten?
Wie es der Zufall will, kommen auch meine Streams nicht richtig an.
Der listener wird getriggert, ja, aber ich weiß nicht ob es an gesperrten Verbindungen im Netzwerk (eingeschränkte Rechte) oder an meinem Code liegt, da Debugging in diesem Context zu keiner Lösung geführt hat.
Danke.