![]() |
Ports checken
Hi,
ich will ein Chat- Programm für Lan schreiben. Damit man an einem Rechner mit mehreren anderen gleichzeitig chatten kann, starte ich mehrere Instanzen (eine Instanz kann dabei mit einer Instanz auf nem anderen Rechner kommunizieren). Das hat die Konsequenz (zumindest so von dem was ich so lese), dass jeder einzelne ChatKanal (nenn ich einfach mal so, ich mein die IP- Verbindung zwischen 2 Instanzen) über einen eigenen Port laufen muss. Solange nur mein Programm TCP/IP benutzt, is die Portverteilung ja kein Problem... jede Instanz schreibt den Port, den sie benutzt in eine Liste, basierend darauf können die Progs dann untereinander ausmachen, über welchen Port sie kommunizieren wollen (wie ich diese Portverhandlung mache, weiß ich schon). So, das Problem is allerdings, dass ja so gut wie jeder, dessen Rechner an einem Lan hängt auch Programme laufen hat, die irgendeinen TCP/IP Port benutzen. Und fremde Programme schreiben ja in keine Liste, welche Ports sie benutzen. Ich müsste also quasi für jeden Port einzeln überprüfen, ob irgendein Programm diesen für seinen Datenverkehr benutzt. Und da steckt mein Problem. Ich hab 1. keine Idee, wie ich die Ports in meinem eigenen Programm quasi durchscannen kann und 2. (was wohl das leichtere von beiden is) weiß ich nicht, wieviele Ports es pro IP- Adresse überhaupt gibt (müsste man ja für die Scanschleife wissen - wenn mans denn per Schleife macht). Hab schon ziemlich lange nach ner Lösung gesucht, aber noch nix gefunden. Kann mir also von euch irgendeiner sagen, wie ich eine Auflistung der unbenutzten Ports realisieren kann? Danke schonmal, S - tefano |
Moin S-tefano,
erst einmal herzlich willkommen. Ausprobiert hab' ich's bislang noch nicht, aber schau Dir doch mal im PSDK die Funktion GetTcpTable an. Damit kann man sich eine Tabelle aller TCP Verbindungen mit Local Address/Port und RemoteAddres/Port abfragen. GetTcpTable ist eine IP Helper Funktion. |
Zu 1.
Ob ein Port "besetzt" ist oder nicht, kannst du mit einem ClientSocket testen. Wenn eine Verbindung zustande kommt, hängt ein Server an dem Port, falls nicht, hängt keiner dran. Zu 2. Es gibt 2^16 - 1 (65535) Ports pro Rechner. Aber die alle zu überprüfen, ist sehr rechenintensiv. Die ersten 1024 Ports solltest du aber nicht verwenden, diese sind nämlich für Standard-Server reserviert. Bei den 65535 gibts aber ne ganze Menge, die frei sind, also wirst du wohl nicht jeden einzelnen abfragen müssen :wink: |
Hi,
danke, das mit dem Clientsocket is ja sehr gute Idee, wär ich gar nich drauf gekommen.:idea: So viele Ports? Hui, dann werd ich das mit der Portliste wohl erstmal verwerfen... Also, vielen Dank nochmal, werd ich in den nächsten Tagen - wenn die Klausuren überstanden sind - an die Arbeit machen. :coder: Bis dann, S - tefano |
Hallo,
ich verstehe zwar nicht ganz wie du das meinst, mit der Liste und so, aber wieso nimmst du nicht einfach UDP/IP mit Broatcast Packeten um deine Rechner zu entdecken und die Ports auszutauschen?! Eigentlich sind doch die Ports von ClientSocket egal. Thomas |
Moin S - tefano,
mal ein kleines Beispiel anbei (siehe Attachement) |
Auf meiner Homepoage gibt es jetzt den Internet-Monitor mit Soße. Eventuell hilft das ja etwas. da ist das mit dem IP-Tisch auch drin.
|
Hi,
danke @Luckie und Bunny, werds morgen mal ausprobieren. Aber @Fiasko: Höhrt sich ja recht interessant an, aber damit kenn ich mich kaum aus... Kannst du mir dazu n bissken mehr erzählen? Brauch ich da z.B. andere Komponenten für, und was für Aktionen müsste ich ausführen? Und: Jo, das mit der Aussage dass die Ports beim Cliensocket egal sind, leuchtet sogar ziemlich ein, war mir irgendwie in den endlosen Weiten meiner Hirnwindungen abhanden gekommen. Wobei ich dann fragen muss: Kann sich ein Client mit einem Server z.B. auf des Servers' Port 6005 oder so verbinden, wenn auf dem Rechner des Clients bereits eine andere Instanz auf selbigem Port eine Serverconnection mit einem anderen Clientrechner hat? Kann ich mir ja eigentlich nich vorstellen, weil sich dann ja auf dem Rechner dann zwei Verbindungen auf einem Port überschneiden würden. Somit wärs also doch nich egal, wies mit Ports beim Client aussieht. Ich selbst weiß es nicht genau, was sagt ihr anderen dazu (eure Beispiele genießen nach wie vor Priorität)? Bis dann, S - tefano |
Hallo,
Zitat:
![]() Zitat:
Wenn dein Proggie nur im LAN funktionieren soll und es auch nicht so schlimm ist wenn mal ein Packet verlohren geht (UDP arbeitet Verbindungslos und merkt deshalb nicht, wenn Packet eher oder garnich ankommen), dann würde ich nur UDP verwenden. Das macht das ganze nämlich sau einfach: du brauchst ja nur alles per Broadcasts auf nem einheitlichen Port senden (na OK, besser ist wohl Multicast, da kann man Packet mehrere Ziele geben, denn bei Broadcast wird ja jeder Rechner genervt und evtl. noch irgendwas in weiter lokale Segmente geroutet. Für jeden Rechner extra Packete ist auch nicht gerade ressourcensparend und erzeugt unötig viel Traffic.) Thomas |
Hi,
hm, das mit dem GetIPTable is ja gar nich schlecht, aber ich glaub in meinem Fall werd ichs erstmal über die Clientsocket- Verbindungsversuchs- Methode probieren. Ich werd euch auf dem Laufenden halten - besonders was probleme angeht ;-) Bis dann und danke nochmal, S - tefano |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz