![]() |
Bevor ich mich jetzt dran mache:
wie lautet denn deine IP-Adresse auf der du das getestet? In deiner ersten Mail steht 192.168.2.x in deiner letzten steht 192.168.0.x; Hast du womöglich mit meiner IP getestet? Das bei der Timerlösung die letzte nicht mehr in Listbox2 auftaucht, ist logisch. Setzt mal das i:=i+1 hinter die if-abfrage, dann wird die letzt auch getestet. |
Oh bin ich blöd, ja die Variante ohne Timer funkst jetzt!
Bei der mit Timer, sagt er das er die adress nit ändern kann während der Socket aktiv ist, weil er client1.close nit annimmt bzw. weil er den timer nit abschaltet! [/delphi] procedure TForm1.Timer1Timer(Sender: TObject); begin Client1.host:='192.168.2.'+inttostr(i); Try Client1.Open; If Client1.Socket.Connected then Begin Listbox1.Items.Add(Client1.Host); client1.Close; end else Begin Listbox2.Items.Add(Client1.Host); end; finally Client1.Close; If i=105 then Timer1.Enabled:=false; i:=i+1; end; end; [delphi] Das ist aber eigentlich egal weil die andere Variante, die die schöner ist funktioniert und dafür bin ich sehr dankbar! Echt vielen Dank weil sonst wäre ich glaube ich nie dahinter gestiegen! :D Thx @wardz |
Ach ja ein Problem gibt es noch, was ich mir fast schon gedacht habe!
Da die IP ja x.x.x.x vier Stellen hat und ich also drei weitere Forschleifen davor geschaltet habe, wird der Pc überlastet. Er sagt mir das der Puffer voll ist Genau gesagt! Windows socket error:Ein Socketvorgang konnte nicht ausgeführt werden, da dem System Pufferspeicher fehlte oder eine Warteschlange voll war (10055), on API'connect' Wie kann ich nach einer bestimmten Zeit den Speicher wieder freigeben!
Delphi-Quellcode:
Oder kann ich vielleicht 4 verschieden Proceduren anlegen, weil ja nach dem schliessen der Procedure der speicher wieder freigegeben wird?
procedure TForm1.Button3Click(Sender: TObject);
var i,c,b,a: Integer; begin ListBox1.Clear; ListBox2.Clear; For a:=1 to 255 do Begin For b:=1 to 255 do Begin For c:=1 to 255 do Begin For i:=1 to 255 do begin Client1.host:='192.'+inttostr(b)+'.'+inttostr(c)+'.'+inttostr(i); Try Client1.Open; Application.ProcessMessages; if Client1.Socket.Connected then Begin ListBox1.Items.Add(Client1.Host); exit; end else //ListBox2.Items.Add(Client1.Host); Client1.Close; except beep; end; end; if Client1.Socket.Connected then Begin exit; end; end; end; end; end; Ich weiss das der scan bei mehr als 4 Millaren möglichkeiten vermutlich nie fertig wird aber ich wollte eine Eingrenzung später möglich machen! Die Fehlermeldung kommt auch schon bei einem Spektrum von 192.168.1.1 bis 192.168.3.1 also ja nur 765 Möglichkeiten! Gibs da vielleicht ne Möglichkeit? Danke! |
Was machst du denn damit? Für ein Chatprogramm schon etwas merkwürdig. Sieht mir eher wie ein Suchprog für offene Ports aus. Aber naja.
Du bist dir schon im Klaren, das wenn du die suche startest (im Internet), das du dann erstmal eine Kanne Kaffee kochen und dann auch trinken kannst, bis das fertig ist. :mrgreen: Aber gut, zurück zu deinem Problem. Ich schau mir das mal an. Mal sehen, was ich rauskriege. |
Mein Chatprogramm hat
Server-soll bei mir laufen Client-soll bei diversen nutzern laufen! Ip-scanner soll nun also meine IP für die Clients rausfinden, da ich ja keine static IP habe! Kanne Kaffe is gut, ich habe ausgerechtet, das ich rund ein dreiviertel jahr brauche um alle IP's zu testen! :? Naja ich weiss aber auch,das mein Provider unserem Router die IP's von 213.146.1.1 bis 213.146.255.255 vergibt,was den Scan ja auf 255*255=65025 reduziert, jedoch kommt die Speicherüberlastung schon nach ungefähr 500 gescannten IP's! Wenn ich das nu auf die Reihe bekomme, ist mein server immer erreichtbar Eine Andere Möglichkeit wäre mein in eine Website zu integrieren, jedoch weiss ich nit ob das so ohne Probleme geht, da ich bis jetzt nur einfache Programme integriert habe wie Taschenrechner oder Counter! Die sind ja nicht ständig aktiv, sondern werden von einem Betrachter der Website geöffnet! Noch ein grund ist das es vielleicht Konflikte mit dem Port geben könnte, aber wie gesagt habe mich noch nicht damit befasst! Danke im Vorraus! @wardz :coder: |
Ich denke in deinem Fall kannst du das nur über UDP realisieren.
UPD ist ein Verbindungsloses Protokoll. D.h. du schickts einfach an jede IP ein UDP-Packet, nix wildes nur irgendein zeichen. Wenn dein Server dann so ein Zeichen empfängt, dann kann er ja per TCP eine Verbingung aufbauen, die IP hast du ja dann. Nach Verbindungsaufbau hat der Client dann auch die Server-IP. Wär das ne Idee ? |
UDP
Ja egentlich schon aber dann muss ich auf die TCP Komponente
umsteigen oder? Wenn ja dann werde ich wohl das erstma in angriff nehmen und mein Programm umschreiben! Thx :coder: |
Oder geht das nit auch vielleicht wenn ich den Clientsocket nach jeder 255 for-schleife freisetze und dann neu erzeuge? Habe ich vesucht aber ich glaube der übernimmt dann den Fehlercode 0 nit!
Delphi-Quellcode:
Der schreit dann asynchron socket... aber das versteh ich nit!procedure TForm1.BitBtn1Click(Sender: TObject); var a,b: Integer; begin If client1.Active=false then Begin ListBox1.Clear; For b:=1 to 255 do Begin client1:=Tclientsocket.Create(self); client1.Close; client1.Port:=25555; client1.Socket. For a:=1 to 255 do begin Client1.host:='192.168.'+inttostr(b)+'.'+inttostr(a); Try Client1.Open; Application.ProcessMessages; if Client1.Socket.Connected then Begin ListBox1.Items.Add(Client1.Host); exit; end; client1.Close; except beep; end; end; end; end; end; Theoretisch müsste das doch geht, weiter der Speicher dann freigegeben wird wenn man das Objekt freisetzt oder? Danke @wardz |
Du folgendes erzeugt:
Code:
aber, wo ist das client1.free ? :?:
client1:=Tclientsocket.Create(self);
|
War vor dem Create vom Socket also:
Delphi-Quellcode:
Komisch is nur das der Fehler unregelmässig auftritt!procedure TForm1.BitBtn1Click(Sender: TObject); var a,b: Integer; begin If client1.Active=false then Begin ListBox1.Clear; For b:=1 to 255 do Begin client1.Free; client1:=Tclientsocket.Create(self); client1.Close; client1.Port:=25555; For a:=1 to 255 do begin Client1.host:='192.168.'+inttostr(b)+'.'+inttostr(a); Try Client1.Open; Application.ProcessMessages; if Client1.Socket.Connected then Begin ListBox1.Items.Add(Client1.Host); exit; end; client1.Close; except beep; end; end; end; end; end; Mi F7 habe ich mehr mals probiert und bin bis 255 durch gelaufen wenn ich es langsam gemacht habe, wenn ich F7 gedrückt hielt, hin er sicht ca nach 10 Ip's auf!? Vielleicht ist die Schleife zu schnell für das freigeben des Sockets? ??? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 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-2025 by Thomas Breitkreuz