Entwickler-Ecke

Internet / Netzwerk - clientsocket.OnConnect Problem...


Terra - Fr 16.06.06 09:43
Titel: clientsocket.OnConnect Problem...
Ich habe hier eine Procedure, die sich ja irgendwo selbst erklärt. Allerdingst hab ich da ein gewalltiges Problem:


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:
25:
procedure TForm1.BtnConnectClick(Sender: TObject);
var i: integer;
    antwort : array [0..99of string;

const ServerIP : array [0..1of string = ('127.0.0.1''80.70.60.50');

begin
  for i := 0 to 1 do begin
  ClientSocket.Host := ServerIP[i];
  ClientSocket.Port := 80;
  clientSocket.Open;
 if clientsocket.OnConnect(nil, clientsocket.Socket) = true then //was muss nach onConnect( hin ?
  begin
  ClientSocket.Close;
  antwort[i] := 'Connect OK!';
 end else
  begin
  ClientSocket.Close;
  antwort[i] := 'Connect Fehler!';
  end;
  sleep(200);
 end;
 suiDialogBox(1,' Information','Server 1: ' + antwort[1] + #13 +
                               'Server 2: ' + antwort[2]         );
end;


Was zum Kuckuck muss ich in der IF Anweisung reinschreiben, damit es funktioniert.
if clientsocket.OnConnect(nil, clientsocket.Socket) = true then ...
Ich bekomme mit dieser Anweisung eine Fehlermeldung. (Invalid Irgendwas)

Kann mir wer das richtig schreiben ???

Terra


jasocul - Fr 16.06.06 09:49
Titel: Re: clientsocket.OnConnect Problem...
user profile iconTerra hat folgendes geschrieben:
Ich bekomme mit dieser Anweisung eine Fehlermeldung. (Invalid Irgendwas)

Kann mir wer das richtig schreiben ???

Wenn du die Fehlermeldung richtig hinschreiben kannst? Sorry, habe heute meinen witzigen Tag.
Ernsthaft: Ich habe jetzt keine Lust Delphi zu starten und beim clientsocket.onconnect nachzusehen, was der Rückgabewert und der Typ ist. Aber das dürfte theoretisch in der OH stehen. Ansonste nschreibe doch einfach die Fehlermeldung genau hin, dann ist meistens schon klar, was da hin muss.


Terra - Fr 16.06.06 10:28

Das ist ja das Problem . .ich weis nicht mehr genau was Delphi geschrieben hat. Habe hier auf Schule kein Delphi und zu Hause kein Internet um schnell mal zu korrigieren. (Tolle kombination)

Die Fehlermeldung bezieht sich auf clientsocket.OnConnect(nil, clientsocket.Socket); um genau zu sein auf das clientsocket.socket.

Dort möchte er ein TCustomWinSocket haben. kann damit aber nichts anfangen.

onConnect(Sender: TObject; Socket:TCustomWinSocket); so in etwa wird onConnect gehändelt.

Terra


Fighter#1 - Fr 16.06.06 10:37

Soweit ich dich verstehe, soll das ein IP-Scanner sein?
Aber das OnConnect ereignis solltest du nicht provozieren, um zu schauen ob du verbunden bist.
Du könntest aber im onconnect ereignis mit try except versuchen einen Text an den Server zu senden.


Könnte so ausschaun:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure OnConnect(...);
begin
try
ClientSocket1.Socket.SendText('IP-Scanner Lookup');
antwort[i]:='Connect OK';
except
antwort[i]:='Connect Fehler';
end;
end;

procedure OnError(...);
begin
ErrorCode:=0;
end;


i und antwort müsstest du in den Private oder Public bereich setzen um procedure übergreifend damit arbeiten zu können.

MfG Fighter#1


jasocul - Fr 16.06.06 10:39


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:
25:
procedure TForm1.BtnConnectClick(Sender: TObject);
var i: integer;
    antwort : array [0..99of string;

const ServerIP : array [0..1of string = ('127.0.0.1''80.70.60.50');

begin
  for i := 0 to 1 do begin
  ClientSocket.Host := ServerIP[i];
  ClientSocket.Port := 80;
  clientSocket.Open;
 if clientsocket.active then 
  begin
  ClientSocket.Close;
  antwort[i] := 'Connect OK!';
 end else
  begin
  ClientSocket.Close;
  antwort[i] := 'Connect Fehler!';
  end;
  sleep(200);
 end;
 suiDialogBox(1,' Information','Server 1: ' + antwort[1] + #13 +
                               'Server 2: ' + antwort[2]         );
end;

Es gibt Tage ... *kopfschüttel*
OnConnect ist ein Ereignis und keine Methode, bzw. Funktion.
Um zu prüfen, ob die Verbindung besteht, musst du es nur so ändern, wie ich es um Source gemacht habe.
Ich habe die Änderung allerdings jetzt nicht geprüft.


Terra - Fr 16.06.06 10:44

Achso ... danke.

Warum kann ich denn nicht mit den Funktionen (bzw. Ereignisse) arbeiten, wenn se mir aber angeboten werden? Verstehe ich nicht ganz. Hab so weit noch nicht gearbeitet, das mir das bewusst wäre.

Trotzdem vielen Dank für die Hilfen.


Achso @Fighter: Genau diese Version wollte ich ja eigentlich verhindern, da ich damit schwierigkeiten bekommen habe. Bin ja schon selbst erstaunt, das ich die Prozedure von mir fast ganz alleine hinbekommen habe ^^

Terra


jasocul - Fr 16.06.06 10:48

Das *kopfschüttel* war auf mich bezogen und nicht auf dich. :wink:
Das kann man schon. Nur die Methode, die du verwenden wolltest, ist keine Funktion und hat somit auch keinen Rückgabewert, den du abfragen könntest. Also kannst du es in einer If-Abfrage nicht verwenden. Du kannst es höchstens wie eine Prozedur verwenden.


Terra - Fr 16.06.06 10:58

Zitat:
Das *kopfschüttel* war auf mich bezogen und nicht auf dich.

Wär auch nicht weiter schlimm gewesen. ^^

also wäre es dann möglich wenn ich das onConnect so verwende?


Delphi-Quelltext
1:
clientsocket.onConnect := geheZuProdedureDieIrgendwasMacht;                    


Liege ich da richtig?

Terra


Fighter#1 - Fr 16.06.06 11:01

ja


Terra - Fr 16.06.06 11:08

user profile iconFighter#1 hat folgendes geschrieben:
ja


^^ Danke.

So langsam verstehe ich den unterschied.

Terra


Narses - Fr 16.06.06 12:28

Moin!

Nur der Vollständigkeit halber... ;)
user profile iconjasocul hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.BtnConnectClick(Sender: TObject);
var i: integer;
    antwort : array [0..99of string;

const ServerIP : array [0..1of string = ('127.0.0.1''80.70.60.50');

begin
  for i := 0 to 1 do begin
  ClientSocket.Host := ServerIP[i];
  ClientSocket.Port := 80;
  clientSocket.Open;
// das wird so nicht klappen, weil hier erst eine Ereignisverarbeitung
// stattfinden muss; also min. Application.ProcessMessages (ist eher Hack-Charakter)
// besser: auf ein OnConnect() oder OnError() warten, dann ist .Active erst gültig!
 if clientsocket.active then [...]


cu
Narses