Entwickler-Ecke
Netzwerk - Socket
RainerD - Sa 18.06.16 11:57
Titel: Socket
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
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) { 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(); } }
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 Th69: C#-Tags hinzugefügt
Moderiert von Th69: lange Liste von usings aus Code entfernt
Th69 - 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 - 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
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 {
public ClientRO c { get; set; } public ServerRO s { get; set; }
public MainWindow() { InitializeComponent(); }
private void btnStartListening_Click(object sender, RoutedEventArgs e) { 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(); } }
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 Christian S.: C#-Tags hinzugefügt
Th69 - 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 - 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 Christian 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 - 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 - 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 - 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 Christian S.: C#- durch Quote-Tags ersetzt
RainerD - 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 Christian S.: Beiträge zusammengefasst
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 Christian S.: C#-Tags hinzugefügt
Th69 - 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 - 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 Th69: Thema als beantwortet markiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!