| Autor |
Beitrag |
SmiRnoff
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 04.02.09 16:15
Hallo und  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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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. 
_________________ We are, we were and will not be.
|
|
SmiRnoff 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 04.02.09 18:45
Moin und  im Forum!
SmiRnoff hat folgendes geschrieben : | 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. |
SmiRnoff hat folgendes geschrieben : | | Ist da keie möglichkeit für einen TCP server? |
Nein, das ist bei TCP einfach so gedacht.  Um eine IP-Adresse zu beziehen, verwendet man normalerweise auch das DNS.
SmiRnoff hat folgendes geschrieben : | | 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.
SmiRnoff hat folgendes geschrieben : | 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.
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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
SmiRnoff 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 04.02.09 19:02
Moin!
SmiRnoff hat folgendes geschrieben : | 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).
SmiRnoff hat folgendes geschrieben : | | 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.
SmiRnoff hat folgendes geschrieben : | | wie kann ich diese sache mit dem ping in mein programm einbauen.. ? | Kuckst du.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
SmiRnoff 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 04.02.09 22:17
|
|
SmiRnoff 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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? =/
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:
| procedure TForm1.Button1Click(Sender: TObject); var L, I, P: Integer; GetIP, GenIP: String; Stop: Boolean; begin GetIP := IdIPWatch1.LocalIP; L:=length(GetIP); P:=0; For I:=1 to length(GetIP) do P:=pos('.',GetIP); delete(GetIP,L+2-P,L); While (Stop <> true) do begin For I:=0 to 255 do begin GenIP:=GetIP+inttostr(I); ClientSocket1.Host := Server.Text; ClientSocket1.Open; if (ClientSocket1.Active) then Stop := true; end; end; end;[/list] |
--- Moderiert von Narses: Beiträge zusammengefasst---
Hopala
da ist ein felher in der syntax
es ist nicht
Delphi-Quelltext 1:
| ClientSocket1.Host := Server.Text; |
sondern natürlich
Delphi-Quelltext 1:
| ClientSocket1.Host := GenIP; |
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 05.02.09 00:25
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 SmiRnoff hat folgendes geschrieben : | | 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)
Delphi-Quelltext 1: 2: 3:
| L:=length(GetIP); P:=0; For I:=1 to length(GetIP) do P:=pos('.',GetIP); | 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.
Delphi-Quelltext 1:
| delete(GetIP,L+2-P,L); | 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
...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| While (Stop <> true) do begin For I:=0 to 255 do 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...
|
|