Laden...

IP-Adresse über TcpClient-Verbindung herausfinden

Erstellt von ec-hasslau.de vor 18 Jahren Letzter Beitrag vor 16 Jahren 6.339 Views
ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren
IP-Adresse über TcpClient-Verbindung herausfinden

Hallo Leute!

Ich würde gern über erstellte TcpClient-Verbindung bzw. NetworkStream die IP bzw. den Name des verbundenen Rechners herausfinden... Ist das möglich?
Wenn nicht, was gibt es für Alternativen?

Danke, ec-hasslau.de

100 Beiträge seit 2005
vor 18 Jahren

blöde frage...
Wenn du dich mit TcpClient.Connect(...) zu einem IPEndpoint verbindest, dann hast du den doch eh..

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren

Intelligente Antwort...
Nein, wenn ich einen Server aufmach und auf Connections warte nicht!

F
529 Beiträge seit 2003
vor 18 Jahren

Hm, so blöd ist die Frage nicht. Du kannst ja auch einen TcpClient von einem TCPListener bekommen.

Jedenfalls hat man damit recht große Probleme, wenn man nicht VS2005 nimmt(Da bietet die Klasse endlich direkt Zugriff auf den Socket...)

Es gibt drei Möglichkeiten:
a) Eine neue Klasse erzeugen die vom TCPClient erbt und die Property Server öffentlich zugänglich macht.
b) Auf die Property Server per Reflection zugreifen(habe ich mal machen müssen)
c) Gleich Sockets verwenden

Besuchen sie das VisualC++ - Forum

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren

Gleich mal allgemein:
Ich versuch ein Chat-Prog zu schreiben! Hab mir da einige Möglichkeiten angeschaut, finde das aber alles relativ unkonfortabel. 🤔1.Muss ich die Verbindung (über was auch immer) ständig geöffnet halten? 1.Muss ich da wirklich die ganze Zeit den Server in einer Schleife laufen lassen? 1.Oder gibt es dort kein Event was ausgelöst wird, sobald Nachricht rein kommt?

...kennt ihr da eine einfache Möglichkeit - oder zumindest eine gute Erklärung?

Danke, ec-hasslau.de

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren

PS: Am besten wäre überhaupt erst einmal ein Überblick über das Ganze! Was ist beispielsweise ein "Socket"?

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren

Gut, das hat sich erst mal erledigt!
Hab eine relativ gute Einführung bei Micorsoft gefunden: http://www.microsoft.com/germany/msdn/library/net/csharp/NetworkingMitCSharp.mspx
Und ein einfaches Skript für Server bzw. Client: http://www.csharphelp.com/archives/archive127.html

Dsa hab ich jetzt relativ gut verstanden, also mein Server läuft und kann auch Nachrichten empfangen.

Ich hab jetzt aber mehr ein grundsätzliches "Problem" festgestellt:
Ich will den Chat möglichst so erstellen, das der serverlos funktioniert bzw. jeder Client gleichzeitig Server ist.
Jetzt stellt sich mir die Frage, wie ich das am sinnvollsten realisiere.*Wenn ich den Socket erstell und auf Verbindung warte, wäre es ja sinnlos gleichzeit nochmal eine "umgekehrte" Verbindung (sprich mit mir als Client) zu erstellen. *Aber wenn ich nur den Server erstell, wie kommt dann jemals eine Verbindung zustande?

Hat da jemand eine gute Umsetzung parat?

Gruß, ec-hasslau.de

F
529 Beiträge seit 2003
vor 18 Jahren

Hm, ein selbst verwaltendes Netzwerk(nenne ich in meiner Naivität einfach mal so) ist vermutlich nicht so leicht. Fang erstmal ,,klein" an und entwickle eine getrennte Server-Anwendung.

Dannach baust du eine Funktion ein, mit der du automatisch die Maschine mit dem Server finden kannst(also ohne die IP des PCs mit dem Server zu kennen).

Wenn das geschafft ist, kannst du ja wichtige Teile des Servers im neuen Projekt weiterverwenden.

Natürlich kannst du das oben auch überspringen und gleich sowas machen:
Die Applikation wartet auf dem Port x auf eine neue Verbindung. Weiterhin geht sie alle alle IPs im Netzwerk durch auf der Suche nach anderen Applikationen.
Falls dann mal eine andere Instanz gefunden wurde, fangen die kleinen Problemchen an. Hier gibt es nämlich mehrere Lösungen:
a) Alle Instanzen des Chatprogramms wissen immer genau, welcher Chatter an welcher Maschiene ist und jede Instanz weiß genau, wann sie was zu tun hat. Alle Instanzen haben die selben Rechte.
b) Eine Instanz wird zum Server bestimmt(dazu rate ich). Aber es macht bestimmt einen riesigen Aufwand das ganze zu testen und alle Fehler rauszubauen. Man muss hier halt verdammt aufpassen, dass rechtzeitig die Erbfolge des Servers bestimmt wird. Es kann ja immer mal passieren, dass ein PC vom Netz getrennt wird, abstürzt oder sowas.

Also, wie man wohl lesen kann, habe ich sowas noch nie gemacht. Aber das sind so im groben die Ideen die mir auf die Schnelle dazu eingefallen sind.

Besuchen sie das VisualC++ - Forum

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren
Netzwerk-Chat ohne externen Server

Das ist vielleicht der Grund, warum ich keine sinnvolle Möglichkeit in Netz gefunden hab, die Server und Client in einem ist!
Wenn jemand ein Tutorial kennt, ich wäre äußerst interessiert...

Mit externem Server ist das aber dumm! Du hast ja auch schon festgestellt, dass der mal offline gehen kann - und dann gehen die Probleme los.

Ich hab das ganze Prog schon in VB6 fertig. Aber ich wollte halt die neuen Möglichkeiten nutzen.
In VB6 hab ich das über mailboxes gemacht, dort schreibt man rein und liest das einfach in gewissen Abständen (Zeitgeber) aus. Das ist wesentlich einfacher. Die haben aber nur begrenze Fassungsvermögen - Datei-Versand adé. Außerdem funzen die nur bei Windows...

Mir ist außerdem aufgefallen, dass der Server auf anderen PCs nicht zu starten geht. Da kommt dann ein Fehler: "CodeAccessPermission.Demand" oder so.
Keinen Schimmer wie ich das beheb. Aber bevor ich das nicht hab brauch ich gar nicht weiter machen, weil der Rechner ja sowieso nix empfängt.
Hat dafür jmd. eine Lösung?

PS: Wie nennt man eigentlich so einen Clienten der gleichzeitig Server ist? Stand-alone? Lässt sich nämlich schlecht danach suchen...

Gruß, ec-hasslau.de

S
8.746 Beiträge seit 2005
vor 18 Jahren

Das ist Client-Server vs Peer-2-Peer.

Bei P2P ist das spannende die Auffindungstechnik. Der einfachste Fall wäre ein IP-Broadcast (den alle, die den Broadcast empfangen mit dem Versand ihrer IP beantworten). Um Netzwerkgrenzen zu überwinden kommt man aber auch da um einen Gateway (was nix anderes als ein Server ist) nicht drumrum.

Nett ist auch die Kombination mit multiplen Lookup-Server-Instanzen (nur für die Auffindung). So ist die Verfügbarkeit hoch, die Last liegt aber nur bei den Client. So eine Art Mischung von P2P und CS.

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 18 Jahren

Hättest du auch mal noch paar Tutorials oder sowas?

7 Beiträge seit 2007
vor 16 Jahren

hallo zusammen 🙂
ich bin neu hier und wäre an genannten tutorials zur P2P programmierung auch sehr interessiert, da ich auch eine applikation die ohne eigenständigen server auskommt entwickeln möchte (also client/server in einer anwendung) - ähnlich dem Kademlia Protokoll.

für hinweise auf tutorials oder weiterführende literatur wäre ich also auch sehr dankbar.

LG

bio

ps:
nen chat programm in der art habe ich schon fertig und im grunde geht es mir jetzt um die protokoll-entwicklung, insbesondere zur datei-übertragung und am besten zb. via MFTP, also empfangen von mehreren quellen und übertragen zu mehreren empfängern "gleichzeitig".

7 Beiträge seit 2007
vor 16 Jahren

Original von ec-hasslau.de
Wenn ich den Socket erstell und auf Verbindung warte, wäre es ja sinnlos gleichzeit nochmal eine "umgekehrte" Verbindung (sprich mit mir als Client) zu erstellen.

Aber wenn ich nur den Server erstell, wie kommt dann jemals eine Verbindung zustande?

Du musst schon auch zu dem eigenen internen Server verbinden, da du ja sonnst kaum auch die Nachrichten bekommst die zu deinem Server gesendet werden.
Auch wenn der Server-Thread im selben Programm gestartet wird, musst du dir das gedanklich so vorstellen, als wäre es ein eigenständiger Server irgendwo, zudem Clienten verbinden. Also musst du selbst auch zu diesem Server verbinden um an der Chatsitzung teil zu nehmen.
Auf der gegenüberliegenden Seite läuft das genauso ab (ist ja das selbe Programm 😉 ), dh. jeder verbindet zu jedem und zu sich selbst. Das kannst du ja erstmal manuel ausführen um das zu testen. Später kann man das dann automatisieren indem man die eingehende Verbindung von einem Client auch als Serveradresse (RemoteEndPoint) benutz und automatisch verbindet. Eine verwaltung der Clienten in nem Array wäre natürlich sinnvoll.
Bedenken dabei musst du aber dass das ganze bei einer evtl. weltweiten Vernetzung schlecht skalierbar wird wenn jeder zu jedem verbindet und jeder Client alle Daten vorhällt. Bei Chat Sitzungen von ein paar hundert Clienten dürfte das aber kein Problem darstellen.