Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi verbindung weiterleiten (https://www.delphipraxis.net/109742-verbindung-weiterleiten.html)

gandime 6. Mär 2008 19:37


verbindung weiterleiten
 
Hi,
ich möchte eine Verbindung weiterleiten und ich hab mir das so gedacht:
Din serversocket bekommt eine Verbindung.
danach werden alle Verbindungen die der Server erhält an den Clienten weitergeleitet, welcher dann zu einem anderen Server connected.
Die daten die der client erhält werden zum serversocket zurückgeschickt und dann halt zu der Verbindung geschickt.
Hab das mal versucht zu realisieren:
Delphi-Quellcode:
procedure write(p_test:pansichar);
var
  i:integer;
begin
  for i:=0 to form1.ServerSocket1.Socket.ActiveConnections-1 do
  begin
    form1.ServerSocket1.Socket.Connections[i].SendBuf(p_test,length(p_test));
  end;
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  me_meg.Lines.Add('server: client connected');
  clientsocket1.Active:=true;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  p_text:pansichar;
begin
  me_meg.Lines.Add('client msg: '+Socket.ReceiveText);
  Socket.ReceiveBuf(p_text,Socket.ReceiveLength);
  write(p_text);
end;


[procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  p_text:pansichar;
begin
 me_meg.Lines.Add('server msg: '+Socket.ReceiveText);
 Socket.ReceiveBuf(p_text,Socket.ReceiveLength);
 clientsocket1.Socket.SendBuf(p_text,Socket.ReceiveLength);
end;
blos das funzt nicht ganz so wie ich es will...
muss ich vlt einen TCP-Server verwenden?


mfg
gandime

Apollonius 6. Mär 2008 19:40

Re: verbindung weiterleiten
 
TServerSocket ist ein TCP-Server. Du solltest dir dringend mal anschauen, wie man mit PChars arbeitet. Insbesondere solltest du Speicher reservieren, bevor du ihn verwendest.

gandime 6. Mär 2008 19:45

Re: verbindung weiterleiten
 
Das selbe könnte man ja auch mit Strings machen aber ein String kann nicht alle Zeichen darstellen, soweit ich weiss!
Was muss ich denn bei Pchar beachten?

Apollonius 6. Mär 2008 19:56

Re: verbindung weiterleiten
 
Hier geht es nicht um die Darstellung. Insofern ist es egal, ob du String oder PChar nimmst, aber bei beidem musst du erst Speicher reservieren!

Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  p_text:pansichar;
begin
  me_meg.Lines.Add('client msg: '+Socket.ReceiveText); //Mit ReceiveText wird der interne Puffer geleert - die Daten sind futsch!
  Socket.ReceiveBuf(p_text,Socket.ReceiveLength); //Ein PChar ist nur ein Zeiger. Du kannst keinen Zeiger empfangen!
  write(p_text);
end;
Du musst dir mit GetMem Speicher reservieren und dann mit diesem Speicher arbeiten und ihn mit FreeMem wieder freigeben.

In den anderen Funktionen sind auch noch Fehler drin, aber im Prinzip ist es immer der gleiche wie oben.

gandime 7. Mär 2008 20:25

Re: verbindung weiterleiten
 
So ich hab das jetzt wieder mit Strings gemacht und es funktioniert soweit!
blos wie könnte ich es schaffe mehrere verbindungen gleichzeitig zu verwalten?

edit:
So ich habe mir jetzt noch ein paar Gedanken gemacht^^
die weiterleitung der Daten vom Server zum Clienten sind ja jetzt nicht so schwer, genau so wie die zuweisung blos das Problem ist, wie ich theoretisch undendlich Clientsocket, die dann die einzelnen Verbindungen die beim Server eintreffen weiterschicken.
Also wie kann ich mir "unendlich" viele Clientsockets machen?

edit2:
warum nicht einfach ein array^^
aber ohne Probs geht das ja wiedern nicht ;-)

Die Zuweisung funktioniert nicht über eine Procedure:
Delphi-Quellcode:

Procedure load_cs_settings(cs_load:TClientsocket;i_cs:integer);
begin
  cs_load:=TClientsocket.Create(nil);
  cs_load.Host:='127.0.0.1';
  cs_load.Port:=1080;
  cs_load.Address:=inttostr(i_cs);
end;

begin
  for i:=0 to 999 do
  begin
    load_cs_settings(cs[i],i);
  end;
  cs[0].Active:=true;// Fehler: Zugriffsverletzung
end.

//Das funktioniert aber:
  cs[0]:=TClientsocket.Create(nil);
  cs[0].Host:='127.0.0.1';
  cs[0].Port:=1080;
  cs[0].Address:=inttostr(i_cs);
warum?

Thomas83 10. Mär 2008 08:35

Re: verbindung weiterleiten
 
deine procedure arbeitet mit einer separaten variable.
Entweder musst du eine variable zurück geben oder mit einem pointer arbeiten.

Delphi-Quellcode:
Function load_cs_settings(cs_load:TClientsocket;i_cs:integer) : TClientsocket;
begin
  cs_load:=TClientsocket.Create(nil);
  cs_load.Host:='127.0.0.1';
  cs_load.Port:=1080;
  cs_load.Address:=inttostr(i_cs);
  result := cs_load;
end;
//oder
Procedure load_cs_settings(var cs_load:TClientsocket;i_cs:integer);
begin
  cs_load:=TClientsocket.Create(nil);
  cs_load.Host:='127.0.0.1';
  cs_load.Port:=1080;
  cs_load.Address:=inttostr(i_cs);
end;
//oder irgend wie so
Procedure load_cs_settings(cs_load:PClientsocket;i_cs:integer);
begin
  cs_load^:=TClientsocket.Create(nil);
  cs_load^.Host:='127.0.0.1';
  cs_load^.Port:=1080;
  cs_load^.Address:=inttostr(i_cs);
end;

gandime 13. Mär 2008 10:57

Re: verbindung weiterleiten
 
thx für die antwort jetzt is es mir auch aufgefallen ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz