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



BeitragVerfasst: Mi 04.02.09 16:12 
Moin (:

Hab mir aus spass einen TCP/IP Chat programmiert.
Wollte nun etwas einbauen dass die IP-Adresse des jeweiligen aktiven Servers automatisch herausfindet..
so dass man nicht mehr per Hand die IP-Adresse eingeben muss..
sondern einfach z.B nur auf den button "Auto IP" clickt und der Client sucht den aktiven Server und baut mit der IP dieses servers eine Verbindung auf.

Hoffe ihr könnt mir helfen leute :) Danke im voraus.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 04.02.09 16:15 
Hallo und :welcome: in der Entwickler-Ecke,

Wenn es ein LAN-Chat ist, dann dürfte die einfachste Möglichkeit dafür sein, dass der Server per UDP in regelmäigen Abständen seine eigene IP broadcastet, die die Clienten dann automatisch empfangen und auswerten können.

_________________
We are, we were and will not be.
SmiRnoff Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 04.02.09 16:20 
hallo :) danke für den willkommensgruss

Ja aber ich habe meinen halt auf TCP basis programmiert.
Ist da keie möglichkeit für einen TCP server?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 04.02.09 16:26 
Wie hast du denn das ganze TCP-Gedöns implementiert? Alles selbst geschrieben, oder mit den Indy-Komponenten? Bei denen gibt es auch noch einen UDP-Server und -Client, d.h. man müsste nur Server- und Client-Programm um eine Kleinigkeit erweitern.
Der eigentliche Chat würde weiter über TCP laufen, nur die Übermittlung der Server-IP über UDP. Und so, wie ich das verstehe, ist das auch nur über UDP so möglich - ansonsten müssste Server oder Client alle möglichen Adressen nacheinander durchgehen. :nixweiss:

_________________
We are, we were and will not be.
SmiRnoff Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 04.02.09 16:34 
Okay hab dass verstanden :)

also hab keine indy componenten benutzt.. habe die normalen von delphi den TSocketServer/TSocketClient :)
hmm dass mit dem UDP hab ich verstanden :) hmm und so wie das aussieht ist das auch am einfachsten..
aber ich will unbedingt op diese komponenten verzichten.. da wir sie selber nicht in der schule haben.

hmm wie müsste ich es dann machen damit der client alle ipen durch geet?
also da der chat im LAN läuft.. könnte ich doch einfach die localhost nehmen und dann einfach die letzten zahlen durchgehen lassen.. also von 0 bis 255

naja oder so :/ aber wie soll ich das anstellen?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 04.02.09 18:45 
Moin und :welcome: im Forum!

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
Wollte nun etwas einbauen dass die IP-Adresse des jeweiligen aktiven Servers automatisch herausfindet..
so dass man nicht mehr per Hand die IP-Adresse eingeben muss..
sondern einfach z.B nur auf den button "Auto IP" clickt und der Client sucht den aktiven Server und baut mit der IP dieses servers eine Verbindung auf.
user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
Ist da keie möglichkeit für einen TCP server?
Nein, das ist bei TCP einfach so gedacht. :nixweiss: Um eine IP-Adresse zu beziehen, verwendet man normalerweise auch das DNS. :idea:

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
aber ich will unbedingt op diese komponenten verzichten.. da wir sie selber nicht in der schule haben.
Ohne irgendwas Zusätzliches wird das entweder extrem langsam oder sehr schwer. :?

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
hmm wie müsste ich es dann machen damit der client alle ipen durch geet?
also da der chat im LAN läuft.. könnte ich doch einfach die localhost nehmen und dann einfach die letzten zahlen durchgehen lassen.. also von 0 bis 255
Ein Ansatz könnte so aussehen: die eigene IP-Adresse bestimmen, die Subnet-Mask bestimmen, daraus die Netzadresse ableiten (einfaches binäres UND), dann die Subnet-Mask invertieren, um die Anzahl der möglichen Adressen zu bestimmen, jede Adresse anpingen (aber die erste mögliche auslassen, das ist die Netzadresse, die letzte auch, das ist die Broadcast-Adresse). Wenn du ein Ping-Echo kriegst, einen Connect-Versuch machen. Dann brauchst du aber auch im Server+Client eine Applikations- und Versionskontrolle, da du ja nicht weißt, womit du da Kontakt aufnimmst. :idea:

Wenn dir das jetzt alles auf Anhieb zu schwer vorkommt ;) dann solltest du in Betracht ziehen, dass so eine Funktion (ist ja praktisch schon ein Portscanner) vielleicht noch etwas zu hoch für dich ist. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
SmiRnoff Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 04.02.09 18:56 
Hmm naja also da ich auf die UDP componenten verzichten will ^^

ja ich weis es waer einfacher aber trotzdem ich will einem freund beweisen dass es denoch möglich ist mit TCP dies hinzukriegen..

naja ich hab folgendes gemacht :)

hab mier so zusagen einen IP generator programmiert..
Ich finde als erstes die IP des Clienten heraus mit der indy componente IdIPWatch1.
dann lösche ich den letzten teil der IP also alles was nach dem 4 oder besser gesagt letzten punkt kommt..
dann mache ichs so dass er mier in einer schleife von o - 255, 256 IPs generiert.

okay jetzt ist komm ich aber nicht mehr weiter..
und zwar weis ich jetzt nicht wie ich es machen soll dass er immer wieder die geneierte IP ausprobiert..
wie kann ich diese sache mit dem ping in mein programm einbauen.. ?

und vielen dank für die antworten die ihr mir bis jetzt gegeben habt :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 19:02 
Ohne die entsprechende Indy Komponente ist es vielleicht einfacher, wenn du einfach als Host die erzeugte IP einträgst und eine Verbindung versuchst. Das ist zwar nicht die beste Vorgehensweise, aber einfach und funktioniert.
Und bei dem Vorgehen insgesamt ist das auch schon egal. ;-)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 04.02.09 19:02 
Moin!

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
Ich finde als erstes die IP des Clienten heraus mit der indy componente IdIPWatch1.
dann lösche ich den letzten teil der IP also alles was nach dem 4 oder besser gesagt letzten punkt kommt..
dann mache ichs so dass er mier in einer schleife von o - 255, 256 IPs generiert.
Das ist gleich mehrfach falsch:
- wer sagt, dass die Subnet-Mask immer 8 Bit groß ist? In meinem Netz ist das z.B. nicht so. ;)
- die erste und letzte Adresse darfst du nicht verwenden (Netz- und Broadcast-Adressen).

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
und zwar weis ich jetzt nicht wie ich es machen soll dass er immer wieder die geneierte IP ausprobiert..
Du versuchst eine Verbindung herzustellen. Klappt das nicht, ist der Port nicht offen. Klappt das, gilt es immer noch herauszufinden, ob der dahinter lauschende Dienst auch der ist, den du erwartest. :)

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
wie kann ich diese sache mit dem ping in mein programm einbauen.. ?
Kuckst du. :les: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
SmiRnoff Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 04.02.09 22:10 
Abend :)

ja okay aber das program ist eher gedacht um in der schule benutzt zu werden ;)
und naja die haben nur eine von 8 Bit

hmm und dann ist es so dass jeder computer eine postennummer hat.
diese nummer ist dann am ender der IP
z.B hat die IP vom Lehrer PC am enden immer eine null
un dann kommt der 1 erste computer also posten einz.. der hat dann am ende seiner IP eine 1..

naja deswegen ist es mier egal ;)

okay aber jetzt zurück ^^

naja also dass mit dem ping verstehe ich nicht.. also wie ech jetzt einsetzen soll..

ich will jetzt einfach dass mein client die generierte IP nimmt und mit der versucht eine verbindung zum server aufzunehmen. Falls ech nicht geht nimmt er die naechste genegrierte IP und versucht es.. bis er die benötigte verbindung hat, solbad dies geschehen ist soll er aufhören..

also ich hab keine ahnung wie ich das machen soll =/
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 22:17 
user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
ich will jetzt einfach dass mein client die generierte IP nimmt und mit der versucht eine verbindung zum server aufzunehmen. Falls ech nicht geht nimmt er die naechste genegrierte IP und versucht es.. bis er die benötigte verbindung hat, solbad dies geschehen ist soll er aufhören..
An der Stelle wo du die IP per Hand eingibst, musst du doch nur die von dir generierte eintragen und falls die Verbindung nicht hergestellt werden kann die nächste nehmen. ;-)
SmiRnoff Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 04.02.09 22:30 
Ja daran hab ich auch gedacht aber ich scheine irgendetwas falsch zu machen da sobald ich auf den button clicke
entsteht eine endlose schleife =/

und auch wenn ich nur eine schleife benutze also die die für die generierung der Zahlen ist, baut er keine verbindung auf.. sobald die richtige IP vorkommt macht er einfach weiter..

woran kan dass liegen? was mache ich falsch? =/


ausblenden Delphi-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:
//IP des servers automatisch herausfinden
procedure TForm1.Button1Click(Sender: TObject);
  var
    L, I, P: Integer;
    GetIP, GenIP: String;
    Stop: Boolean;
begin
  GetIP := IdIPWatch1.LocalIP; // herausfinden der Client IP
  L:=length(GetIP); // herausfinden der Läange der IP
  P:=0// Initziallisierung der var P
  For I:=1 to length(GetIP) do P:=pos('.',GetIP); // Position des Punktes in der IP
  delete(GetIP,L+2-P,L); // Löschen der Zahlen hinter dem letzten Punkt in der IP
  While (Stop <> true) do
  begin
    For I:=0 to 255 do // Zahlen von 1 bis 255
    begin
      GenIP:=GetIP+inttostr(I); // Generierung der IP's
      ClientSocket1.Host := Server.Text; // Serveradresse übernehmen
      ClientSocket1.Open;
      if (ClientSocket1.Active) then
        Stop := true;
    end;
  end;
end;[/list]


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

Hopala :)

da ist ein felher in der syntax

es ist nicht
ausblenden Delphi-Quelltext
1:
ClientSocket1.Host := Server.Text; // Serveradresse übernehmen					


sondern natürlich
ausblenden Delphi-Quelltext
1:
ClientSocket1.Host := GenIP; // Serveradresse übernehmen					
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 05.02.09 00:25 
Moin!

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
geet ... mier ... geneierte ...
Sag mal, deine Beiträge kann man ja kaum lesen. :? Schonmal was von Gross-/Kleinschreibung und Zeichensetzung gehört? :nixweiss:


user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
ja okay aber das program ist eher gedacht um in der schule benutzt zu werden ;)
und naja die haben nur eine von 8 Bit
Das mag sein, aber wenn man schon sowas programmiert, dann auch gleich richtig - oder gar nicht (abgesehen davon, dass das eh ein sinnloser Ansatz ist).

user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
naja deswegen ist es mier egal ;)
[...]
also ich hab keine ahnung wie ich das machen soll =/
Da es mir nicht egal ist und du offensichtlich an dieser Stelle überfordert bist, macht es für mich keinen Sinn, hier weiter an einem sinnlosen Ansatz zu fummeln, der keinen weiter bringt. Sorry, aber manchmal ist die Wahrheit bitter... :|

cu :wave:
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.02.09 04:46 
Du hast in dem Code so elementare Fehler, dass ich mich frage, was du mit Netzwerkprogrammierung machst. Das ist kein Thema für den Einstieg in eine Programmiersprache :!:

Deine Aussage zu dem Code
user profile iconSmiRnoff hat folgendes geschrieben Zum zitierten Posting springen:
und auch wenn ich nur eine schleife benutze also die die für die generierung der Zahlen ist, baut er keine verbindung auf.. sobald die richtige IP vorkommt macht er einfach weiter..
zeigt, dass du nicht geschaut hast was der Code eigentlich macht. (Ich meine Debugging...) Ich habe das natürlich nicht ausprobiert was nun wirklich passiert, aber einiges ist mir direkt aufgefallen. Unter anderem, dass die korrekte IP gar ausprobiert werden kann... (außer bei zufällig passenden Längen der Teile der eigenen IP)

ausblenden Delphi-Quelltext
1:
2:
3:
  L:=length(GetIP); // herausfinden der Läange der IP
  P:=0// Initziallisierung der var P
  For I:=1 to length(GetIP) do P:=pos('.',GetIP); // Position des Punktes in der IP
Davon, dass du hier P so oft zuweist wie Buchstaben in GetIP sind, ändert sich ja nichts an dem Wert. Pos gibt bei gleichen Eingabeparametern natürlich immer den selben Wert zurück. Nämlich die Position des ersten Punktes.

Wenn du eine Schleife über alle Buchstaben machst, dann musst du auch auf die einzelnen Buchstaben GetIP[i] zugreifen und diese prüfen. Am besten bei Length(GetIP) angefangen nach vorne bis zum hintersten Punkt. Warum du da nicht gleich L benutzt ist mir auch nicht ganz klar. ;-)

Eine Alternative wäre PosEx.

ausblenden Delphi-Quelltext
1:
  delete(GetIP,L+2-P,L); // Löschen der Zahlen hinter dem letzten Punkt in der IP					
P ist die Position des ersten Punktes. Beispiel: GetIP = '192.168.0.1'
L = 11
P = 4
L + 2 - P = 9
Du löschst also von Buchstabe 9 ab 11 Buchstaben...
Ergebnis: GetIP = '192.168.'

Deine IPs sehen also so aus:
192.168.0
192.168.1
...

Ach ja: selbst wenn P die Position des hinteren Punktes beinhalten würde, würde es nicht passen:
GetIP = '192.168.0.1'
L = 11
P = 10
L + 2 - P = 3
Du löschst also von Position 3 ab 11 Buchstaben.
Ergebnis: GetIP = '19'

Deine IPs sehen also so aus:
190
191
...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  While (Stop <> true) do
  begin
    For I:=0 to 255 do // Zahlen von 1 bis 255
    begin
      [...]
      if (ClientSocket1.Active) then
        Stop := true;
    end;
  end;
end;
Deine While-Schleifenbedingung wird ja erst ausgewertet, wenn die for-Schleife durchgelaufen ist. Statt Stop := true müsstest du aus der for-Schleife heraus und die while-Schleife brauchst du nicht. Das geht mit Break, damit beendest du die aktuelle Schleife.

Ohne die Fähigkeit ein Programm zu debuggen (Haltepunkt setzen, mit F8 zeilenweise durch, usw.) und ohne dir zu überlegen was du wo machst (Berechnungsfehler für Delete, ...) kommst du mit Netzwerkprogrammierung garantiert nicht weit...