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



BeitragVerfasst: Sa 19.02.11 22:22 
Hallo Leute,

ich habe so eine Art Schiffeveersenken programmiert, wobei man mit mehreren Spielern (über Netzwerk) spielen kann. Ich habe dafür ein Seerver geschrieben, wo sich die einzelnen Clients am Anfang anmelden sollen. Soweit so gut! Die Clients können sich anmelden (die melden sich an port 10000 und senden dem server ihre IP, darauf hin antwortet der Server mit einem neuen Port, der für jeden Client anders ist...) Nach der Anmeldung wird auch nochmal etwas versendet und daraufhin soll der Server ebenfalls antworten. Allerdings kommt dann Aufbau des TCP-Listeners auf dem Port des Clients die Fehlermeldung:

Zitat:
Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden

jeder listener wird nach jedem aufruf auch wieder gestoppt und sockets werden disconnected und geschlossen (Close())

kann mir vll jemand weiterhelden?
vielen Dank im Voraus!


Moderiert von user profile iconKha: Topic aus WinForms verschoben am So 20.02.2011 um 00:11
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.02.11 23:12 
Hallo und :welcome:
user profile iconmariosC hat folgendes geschrieben Zum zitierten Posting springen:
darauf hin antwortet der Server mit einem neuen Port, der für jeden Client anders ist...
Gibt es dafür einen speziellen Grund? :gruebel:
Warum bleibst du nicht bei der ursprünglichen Verbindung?

user profile iconmariosC hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings kommt dann Aufbau des TCP-Listeners auf dem Port des Clients die Fehlermeldung:
[...]
kann mir vll jemand weiterhelden?
Ohne ein wenig Quelltext schlecht. ;-)
Wenn der Port wirklich noch unbenutzt wäre, würde es ja klappen.

Welche Ports benutzt du denn? Kann es sein, dass du zufällig von anderen Programmen benutzte Portbereiche triffst?
mariosC Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 19.02.11 23:34 
danke erstmal für die schnelle antwort und die begrüßung :D

hey jaaa!! der code von server und client dürften die 600-700 zeilen überschreiten^^

die stelle wo ich zugreife:

Zitat:
listen = new TcpListener(IPAddress.Any, 10001);
listen.Start();


um zwischen jeden Client zu unterscheiden, und da es mehrere Clients sind es keine kollisionen gibt! Wenn zB der Server gerade mit einem Client kommuniziert und ein anderer Client versucht unter dem glichen Port den server zu erreichen, dann gibts da massi probleme!

wobei der listener davor (bei der Anmeldung und verschiedenen Methoden benutzt wird).
soald ich wweiß liegt 10000 aufwärts (für jeden client ein) nicht unter den well known oder den ports.

außerdem wurde ich auf was anderes aufmerksam gemacht:
Screenshot

dieser Snapshot ist 2 MIN!! nachdem mein programm beendet war!! ist das ergebnis von netstat(cmd)
es soll wohl über 4 min dauern, bis das bis die ports nicht mehr auf wartend stehen :o

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.02.11 00:33 
user profile iconmariosC hat folgendes geschrieben Zum zitierten Posting springen:
Wenn zB der Server gerade mit einem Client kommuniziert und ein anderer Client versucht unter dem glichen Port den server zu erreichen, dann gibts da massi probleme!
Ich habe das noch nicht mit C# gemacht, deshalb weiß ich nicht, ob es da Unterschiede gibt. Aber in Delphi ist das kein Problem, da habe ich einfach mehrere Verbindungen auf dem selben Port. Und die ganzen Server, seien es Webserver oder andere, brauchen auch nur einen Port. :gruebel:

Aber vielleicht sagt ja noch jemand etwas dazu, der das mit C# schon einmal gemacht hat. ;-)

Was die Zeilenanzahl angeht: Ist ja relativ wenig, aber ich meinte auch nicht alles posten, sondern die relevanten Stellen.
mariosC Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 20.02.11 00:55 
hmm ich bin leider auch kein experte! Vielleicht kann ja jemand weiterhelfen...
also von dieser Fehlermeldung:

Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden

lässt sich doch EIGENTLICH erschließen dass es nicht geht oder?!
belehrt mich bitte des besseren :)

lg
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 20.02.11 01:10 
Die sagt doch wahrscheinlich gerade aus, dass es unter deinen verschiedenen TcpListener-Instanzen zu einem Konflikt kommt. Mit Netzwerk kenne ich mich überhaupt nicht aus, aber ich verspreche dir wie jaenicke, dass es auch mit einem Listener und einem Port funktioniert.

_________________
>λ=
mariosC Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 20.02.11 01:20 
Hallo Kha!
ich benutze keine verschiedene Listener-Instanzen sondern initialisiere den Listener immer wieder neu mit dem neuen port:
ausblenden C#-Quelltext
1:
listen=new TcpListener(IPAdress.Any,10000);					


- er baut eine Verbindung auf port 10000 auf
- baut wieder ab
- sendet an port 10000 und schliesst das Socket auch wieder
- sendet an port 10001 und schliesst das Socket
- versucht an port 10001 abzuhören und gibt dabei die Fehlermeldung!!

aber das wäre jetzt zu umständlich das gesamte Programm umzuändern.
aber vielen Dank für die schnellen Antworten
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 20.02.11 01:30 
user profile iconmariosC hat folgendes geschrieben Zum zitierten Posting springen:
ich benutze keine verschiedene Listener-Instanzen sondern initialisiere den Listener immer wieder neu
...erzeugst also verschieden Instanzen...
Natürlich sollte es eigentlich kein Problem geben, wenn du die vorherige Instanz geschlossen hast, tut es aber anscheinend doch. Da lässt sich nur noch sagen, dass du die Klasse eben nicht so verwendest, wie es vorgesehen ist.

_________________
>λ=
mariosC Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 20.02.11 02:34 
jaa darauf bin auch schOn gekommen :D
aber es gibt keine stelle, wo ein listener oder ein socket nicht wieder geschlossen wird!

was könnte man da noch falsch machen?

hast du das bild weiter oben schon gesehen? es scheint so, als würden die ports nicht schliessen sondern paar minuten den status WARTEND behalten...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

hier noch die ausführlichen Details der Exception: siehe Anhang

Moderiert von user profile iconNarses: Inline-Bild wegen Übergröße in den Anhang verlegt.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.02.11 08:18 
user profile iconmariosC hat folgendes geschrieben Zum zitierten Posting springen:
Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden

lässt sich doch EIGENTLICH erschließen dass es nicht geht oder?!
Das ist richtig, es kann auf einen Port nur ein Binding (des Servers) gesetzt werden, da es eindeutig sein muss an welche Anwendung die Daten gehen.

Das gilt aber nicht für die eingehenden Verbindungen. Es können durchaus mehrere Verbindungen gleichzeitig auf dem selben Port laufen. Hier kommen die Sockets ins Spiel. Wenn ein neuer Client anfragt, wird ein Socket dafür erstellt, der dann die Kommunikation mit diesem Client behandelt. Wenn also 4 Clients gleichzeitig da sind, sind auch 4 dieser Sockets zusätzlich da.

Wie das in C# aussieht, weiß ich eben nicht. Eine schnelle Suche bei Google zeigt mir aber, dass es vom Prinzip her genau so auch in C# aussieht (hätte ich auch nicht anders erwartet ;-)), hier ein entsprechendes Tutorial:
www.switchonthecode....-threaded-tcp-server

Für diesen Beitrag haben gedankt: mariosC
mariosC Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 20.02.11 12:01 
:eyecrazy: AAAAAAAAHHHHHH!!!! :eyecrazy:
Leute vielen Dank hat mir teilweise sehr weitergeholfen! Allerdings war der Fehler dann doch in der Spiellogik: und zwar haben Client und Server gleichzeitig versucht sich gegenseitig abzuhören!! Dann st das ja logisch, dass das nicht geht!

danke nochmal und grüße,
marios
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.02.11 13:25 
user profile iconmariosC hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings war der Fehler dann doch in der Spiellogik: und zwar haben Client und Server gleichzeitig versucht sich gegenseitig abzuhören!!
Irgendsowas dachte ich mir ja, deshalb hatte ich auch nach ein wenig Quelltext gefragt. ;-)