Laden...

Server in einem geschlossenen netzwerk finden

Erstellt von blr vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.191 Views
B
blr Themenstarter:in
120 Beiträge seit 2010
vor 12 Jahren
Server in einem geschlossenen netzwerk finden

Hallo liebe Gemeinde

In meinem Spiel hab ich nen Server und Client (x von clienten)
Die sollen in einem geschlossenem Netzwerk miteinander kommunizieren.

Fall1.
Beide pc´s sind mit dem lan-kabel und sind nicht mit dem Interent verbunden.
auf einem pc läuft server und Client, und der Client findet den Server.
Ich gebe einfach "127.0.0.1 : Port" an.

Fall2.

Firewall ist bei beiden aus
2 pc´s werden mit einem Lankabel miteinander verbunden. Beide sind nicht mehr mit dem Internet verbunden
Ip wird mittels "ipconfig" ermittelt und wird anstelle von 127.0.0.1 ersetzt.

An dem anderen wird der Client gestartet
dem Client wird diese eben ermittelte ip auch gegeben....

Und er findet den Server natürlich nicht....
Ich verwende Lidgren Bibleothek

Code vom Server:

 IPAddress.TryParse("192.168.178.20", out ipAdresse);

                ipArray = ipAdresse.GetAddressBytes();
                ipAdresse = new IPAddress(ipArray);

                    Anschluss = new IPEndPoint(ipAdresse, 59643);
                    configuration = new NetPeerConfiguration("WheelsOfSteels");
                    configuration.Port = 59643;
                    configuration.MaximumConnections = 10;
                    configuration.LocalAddress = ipAdresse;
                    myServer = new NetServer(configuration);
                
                      myServer.Start();


Code vom Client:

myConfiguration = new NetPeerConfiguration("WheelsOfSteels");
                
                myClient = new NetClient(myConfiguration);
                
                myClient.Start();
                myClient.DiscoverKnownPeer("192.168.178.20", 59643);
                myClient.Connect("192.168.178.20", 59643);

Zu anderem frage ich mich.....
Die Ip wird dem Server ja jedesmal neu vergeben, wenn er sich im internet oder in einem geschlossenem Netzwerk anmeldet. (denke ich jedenfalls)

Wie müsste der Client mit dieser "DiscoverKnownPeer" suchen?
Muss man da einfach in einem geschlossenem Netzwerk nach IP´s suchen???
Falls ja....wenn es mehrere Clients sind, dann weiss man ja nicht, wer von den der Server ist....
Wie geht man da vor?? Dass der Server sicher gefunden wird???

Danke für jeden Tipp

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo,

In der Regel haben Server statische IPs.
Falls das nicht der Fall dann kannst du unter Umständen auch DNS verwenden (wird im Internet auch so gemacht).
Du gibts "google.de" ein und der DNS Server gibt dir dann die passende IP damit der Browser die Seite laden kann.

In einem LAN funktioniert das in der Regel auch. Durch die Namensauflösung ist es möglich dass du den Computernamen anstatt der IP verwendest.

PS: Probier mal mit einem PING ob der Server erreichbar ist.
Dann siehst du sofort ob es eine Verbindung gibt oder nicht.

Gruß
Michael

B
blr Themenstarter:in
120 Beiträge seit 2010
vor 12 Jahren

Danke für den Tipp...
Die Ip ist erreichbar....

Sobald ich den Server starte, sagt mit "netstat -a", dass unter diesem Port(59643) was läuft, das bedeutet, dass der Server ok ist.

Nun gibt es eine Funktion bei dem DiscoverLocalPeers(59643); und er findet NIX
Da weiss ich ehrlich gesagt net mehr weiter....das ganze läuft jetzt unter 127.0.0.1

G
538 Beiträge seit 2008
vor 12 Jahren

Ich lass mich gerne Korrigieren, aber ich denke doch, dass 127.0.0.1 nur unter dem namen localhost erreichbar ist für Programme die auf dem gleichen Rechner laufen ...

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

156 Beiträge seit 2010
vor 12 Jahren

Ich lass mich gerne Korrigieren, aber ich denke doch, dass 127.0.0.1 nur unter dem namen localhost erreichbar ist für Programme die auf dem gleichen Rechner laufen ...

darauf würde ich auch tippen ... etwas Quellcode vom Server wäre von Vorteil

B
blr Themenstarter:in
120 Beiträge seit 2010
vor 12 Jahren

also ich hab noch mal das ganze überarbeitet.
Situation: beide PC´s sind in einem geschlossenem Netzwerk, ich kann über "Ping" die Ip des anderen rechners erreichern.
Mein Ziel ist:

  1. Der Listner ermittelt die IP selbstständig, mit dem Port zusammen wird dann Socket gebildet.
  2. Irgendwas muss auf der Seite vom Client sein, was die Listner Ip oder den Socket ganz findet....
    Dann kann der Client sich selbstständig zu dem Server verbinden.

Den ersten Teil hab ich hinbekommen:

IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
ipAdresse = iphostentry.AddressList[2];
myTcpServer = new TcpListener(ipAdresse, 59643);

Beim Client, der selbst die eben zugewiesene Adresse finden soll, hab ich sowas ähnliches gemacht:

IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
ipAdresse = iphostentry.AddressList[2];
myClient = new TcpClient(ipAdresse.ToString(), 59643);

Nur findet der zweite Pc ja die IP von sich selbst und nicht von allen Pc´s, die im Netzwerk sind.
Irgendwie muss er den Listner erkennen können...
Hat jemand da ne idee??
Danke für jeden Tipp

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Du musst versuchen Dich bei allen möglichen IPs im lokalen Netzwerk auf den Serverport zu verbinden. Um diese IPs herauszufinden, siehe IP-Adressen aller Teilnehmer am gleichen Subnetz herausfinden.

Du könntest auch direkt vom Server broadcasten, also regelmäßige Broadcasts ins lokale Netz senden, dann kann der Client darauf reagieren und sich anschließend verbinden - dazu muss allerdings dann der Client in der Lage sein, den Broadcast zu empfangen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

156 Beiträge seit 2010
vor 12 Jahren

Den ersten Teil hab ich hinbekommen:

IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());  
ipAdresse = iphostentry.AddressList[2];  
myTcpServer = new TcpListener(ipAdresse, 59643);  

Du musst den Server an "0.0.0.0" bzw. IPAddress.Any binden ... bei allen Anderen lauscht der Server nur an der zugewiesenen NIC

Du könntest auch direkt vom Server broadcasten, also regelmäßige Broadcasts ins lokale Netz senden, dann kann der Client darauf reagieren und sich anschließend verbinden - dazu muss allerdings dann der Client in der Lage sein, den Broadcast zu empfangen.

eher anders herum ... der Client sendet die Broadcasts und der Server beantwortet diese - spart (zwar nur minimal) Netzwerk & CPU

B
blr Themenstarter:in
120 Beiträge seit 2010
vor 12 Jahren

also ich hab dann Serverseitig was mittels BroadCast abgeschickt, ohne dass der Client überhaupt was abhört, bzw. eine Verbindung akzeptiert hat....

Wie muss ich das beim Client machen`?
ich hab ihn erstmal abhören lassen mit Socket.List();
Aber wie empfange ich eben versendete BroadCast-Elemente??
Hat da jemand einen Tipp?

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

also ich hab dann Serverseitig was mittels BroadCast abgeschickt

Damit das beim Client ankommt, muss auf dem Client auch ein Listener laufen, und die Firewall entsprechend eingestellt werden, dass die Pakete reingelassen werden.

Besser wäre - wie mogel vorschlägt - vom Client aus zu broadcasten. Diese Möglichkeit ist ja auch in dem von mir verlinkten Thread beschrieben. Den Broadcast vom Server aus wollte ich nur der Vollständigkeit halber erwähnt haben, da diese Variante wie Du siehst so ihre Tücken hat.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

B
blr Themenstarter:in
120 Beiträge seit 2010
vor 12 Jahren

also ich hab das jetzt geschafft, mittels Broadcast vom Server, die Ip an einen nicht verbundenen Client zu senden.

Beim Client muss einfach die Methode "ReceiveFrom" angewand werden.
Also Senden an den Client ist bei deinem Link beschrieben. Das Empfangen geht so:

  1. Socken defenieren
  2. Eigene IP herausfinden mit Dns.GetHostEntry(Dns.GetHostName())
    3 EndPunkt defenieren (EigeneIP, Port)
  3. Socket binden: Socket.Bind(IPEndPunkt)
  4. Socket.ReceiveFrom(Data, ref IPEndPunkt)

So gelangen daten an den Client, ohne, dass er abhört oder sich verbunden hat

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

ohne, dass er abhört

Jain - diese Aufgabe übernimmt ja in diesem Fall das ReceiveFrom, und auch dabei muss der Socket gebunden werden -> also sehr ähnlich einem Listener.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca