![]() |
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:
blos das funzt nicht ganz so wie ich es will...
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; muss ich vlt einen TCP-Server verwenden? mfg gandime |
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.
|
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? |
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:
Du musst dir mit GetMem Speicher reservieren und dann mit diesem Speicher arbeiten und ihn mit FreeMem wieder freigeben.
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; In den anderen Funktionen sind auch noch Fehler drin, aber im Prinzip ist es immer der gleiche wie oben. |
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:
warum?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); |
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; |
Re: verbindung weiterleiten
thx für die antwort jetzt is es mir auch aufgefallen ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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