Autor Beitrag
RainerD
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 18.06.16 11:57 
Hallo,

seit einigen Tagen versuche ich ein Problem zu loesen, komme dem aber nicht so richtig auf dem Grund.
Ich möchte ein Socket oeffnen zwichen einem Server und einem Client. Siehe u. s. Code.

Das funktioniert auch soweit, jedoch wir die Verbindung nach kurzer Zeit (ca. 20-30 Sekunden) wieder deaktiviert (zu sehen in TCPView).
Zunaecht hatte ich den Garbage Collector in Verdacht, bis ich dann gesehen habe, dass es auf einem Rechner unter Windows 8 funktioniert.
Dort bleibt die Verbindung stabil bestehen, unter Windows 7 jedocht tritt oben beschriebenes Problem auf, dass die Verbindung erstellt wird, aber nach ca. 20 Sekunden
verschwindet/entfernt wird.

Das Programm habe ich komplett abgespeckt, um wirklich nur die basics zu testen, und um das Problem zu lokalisieren.

Es waere wirklich super wenn jemand helfen koennte, da ich einfach nicht weiterkomme.

Firewalls und Vierentester habe ich schon komplett abgeschaltet/entfernt.

LG
Rainer

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
namespace SocketCommunicator
{
    public partial class MainWindow : Window
    {      
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnStartListening_Click(object sender, RoutedEventArgs e)
        {
            //   StartListening();
            ServerRO s = new ServerRO();
            s.test();
        }

        private void btnSendHello_Click(object sender, RoutedEventArgs e)
        {
            ClientRO c = new ClientRO();
            c.SendData();
        }

        private void btnCancelConnection_Click(object sender, RoutedEventArgs e)
        {
        }
    }

    public class ServerRO
    {
        Int32 port = 10001;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");
        TcpClient Client = null;

        public void test()
        {
             TcpListener Listener = new TcpListener(localAddr, port);
             Listener.Start();
             Client = Listener.AcceptTcpClient();        // Blocking methode
        }
    }

    public class ClientRO
    {
         Int32 port = 10001;
         IPAddress localAddr = IPAddress.Parse("127.0.0.1");
         TcpClient Client = null;

         public void SendData()
         {
               if (Client == null)
                 Client = new TcpClient(localAddr.ToString(), port);
         }
     }

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: lange Liste von usings aus Code entfernt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4010
Erhaltene Danke: 824

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Sa 18.06.16 12:13 
Hallo und :welcome:

packe deine beiden Variablen für ServerRO und ClientRO direkt als Member der Klasse MainWindow, so daß der GC diese nicht automatisch wegräumt.
RainerD Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 18.06.16 13:09 
Hi Th69,

danke fuer die schnelle Antwort.
Das Eintragen der Variablen für ServerRO und ClientRO als Class Member der Klasse MainWindow hat keinen Erfolg gebracht. Die Verbindung wird weiterhin nach kurzer Zeit rueckgenommen.

LG
Rainer



Rainer

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
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 SocketCommunicator
{
    public partial class MainWindow : Window
    {

        // Class members:
        public ClientRO c { get; set; }
        public ServerRO s { get; set; }




        public MainWindow()
        {  
            InitializeComponent();
        }



        private void btnStartListening_Click(object sender, RoutedEventArgs e)
        {
            //   StartListening();
            s = new ServerRO();
            s.test();
        }

        private void btnSendHello_Click(object sender, RoutedEventArgs e)
        {
            c = new ClientRO();
            c.SendData();
        }


        private void btnCancelConnection_Click(object sender, RoutedEventArgs e)
        {

        }

    }




    public class ServerRO
    {
        Int32 port = 10001;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");
        TcpClient Client = null;

        public void test()
        {
             TcpListener Listener = new TcpListener(localAddr, port);
             Listener.Start();
             Client = Listener.AcceptTcpClient();        // Blocking methode 

        }
    }




    public class ClientRO
    {
         Int32 port = 10001;
         IPAddress localAddr = IPAddress.Parse("127.0.0.1");
         TcpClient Client = null;

         public void SendData()
         {
               if (Client == null)
                 Client = new TcpClient(localAddr.ToString(), port);
         }
     }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4010
Erhaltene Danke: 824

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Sa 18.06.16 13:40 
Hallo,

auch dein TcpListener ist bei dir nur lokal. Machst du denn in deinem echten Projekt nach dem AcceptTcpClient noch etwas mehr? Sendet bzw. empfängst du denn (kontinuierlich) Daten?
RainerD Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 18.06.16 13:50 
Hallo,

ja klar. Ich sende und empfange dann noch Daten.
Aber das geht auch nur rund 20 Sekunden, bis die Verbindung weggenommen wird.

Daher habe ich alles rausgeschmissen (threading, senden, empfangen etc.), um nur den Code fuer die Verbindungserstellung zu haben.

LG
Rainer

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

.... und der einfachheithalber alles auf localhot.
ist aber auch egal ob im Netwerk oder nicht, die Verbindung wird nach ca. 20 Sekunden "geschrottet"

...seit 4 Tagen suche ich nach dem "Warum".

Rainer
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4424
Erhaltene Danke: 903


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 18.06.16 14:11 
Jetzt hast du ein Scoping Problem mit dem TcpListener der sollte auch eine Klassenvariable sein. Wirst du eh irgendwann brauchen um sauber Listener.Stop am Ende der Anwendung aufrufen zu können.
RainerD Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 18.06.16 14:30 
Hallo Ralf,

habe ein Verstaendnisproblem. Wie soll ich den TcpListener zu einer Klassenvariable machen ?

Bzg. Stoppen, nach Listner.Start() kann ich ihn mit Listener.Stop() sauber stoppen. Das funktioniert soweit.

Mein Problem ist auch im Moment nicht das Stoppen, sondern dass die Verbindung "established" wird, aber nach ca. 20 Sekunden abgeraeumt wird.
...und ich habe keine Ahnung warum das geschieht.

LG
Rainer
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4424
Erhaltene Danke: 903


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 18.06.16 14:57 
Zitat:
Bzg. Stoppen, nach Listner.Start() kann ich ihn mit Listener.Stop() sauber stoppen. Das funktioniert soweit.


Wir haben ja nur Codefragemente ich war davon ausgegangen das du asynchron lauscht. Also das die test Methode zu Ende läuft und du weiterhin auf dem Kanal lauscht. Da wäre es dann schlecht wenn der Listener eine lokale Variable ist.
Wenn du sagst du kannst Listerner.Stop aufrufen dann ja nur in der test Methode. und ich geh mal dann davon aus das du in irgendeiner Art von Schleife in der test Methode Daten aus dem TcpClient liest (Warum dann der TCpClient eine Klassenvariable ist und nicht auch nur eine lokale Variable verstehe ich dann allerdings auch nicht).

Wie du aber mittlerweile merkst könne wir aus deinen Codefragmmenten nur raten. Das reicht scheinbar nicht um das Problem zu sehen.

Moderiert von user profile iconChristian S.: C#- durch Quote-Tags ersetzt
RainerD Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 18.06.16 15:17 
Hi Ralf,

vielleicht habe ich es noch nicht richtig beschrieben.

Natuerlich sieht das ganze Programm komplett anders aus... 100erte Codezeilen (mit Stoppen, Schleifen auf Verbindungsabfragen Pending etc. die volle Floete)...aber das Verhalten ist identisch, auch dort wird die Verbindung nach ca. 20 Sekunden abgeraeumt. Also habe ich alles rausgeschmissen und nur den Body der Verbindungsaufnahme uebrig gelassen, und der verhaelt sich auch so wie das gesamte Programm.

Stoppen ist nicht mein Problem...das die Verbindung nicht gehalten wird ist mein Problem.

Wenn man sich die Beispiele bzgl. TcpListener in den Foren und im Netz anschaut sehen die identisch aus.

Also ich habe keinen blassen Schimmer warum die Verbindung geschrottet wird.



LG
Rainer

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
Int32 port = 10001;
TcpListener server = new TcpListener(port);
server.Start();


TcpClient client = server.AcceptTcpClient();



Das sind die lines of code die aus meiner Sicht den Socket freimachen sobald ein Client sich meldet.

Rainer

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4010
Erhaltene Danke: 824

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: So 19.06.16 09:28 
Dann probiere doch wenigstens mal aus, was passiert, wenn du diese Variable (TcpListener Listener) auch als Klassenmember anlegst...
RainerD Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.06.16 16:25 
Hi,

das loest das Problem, nun wird die Verbindung nicht mehr abgeraeumt.


Danke fuer die Hilfe.

Rainer

Moderiert von user profile iconTh69: Thema als beantwortet markiert.