Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Frage zu SocketServer und senden an einen Client (https://www.delphipraxis.net/55175-frage-zu-socketserver-und-senden-einen-client.html)

tavoc 17. Okt 2005 18:07


Frage zu SocketServer und senden an einen Client
 
Hallo,

ich sitze nun schon längere Zeit ein einem grundlegenden Problem, ich schaffe es nicht das mein Server einem Client Daten sendet.

Ich möchte mit dem Programm erreichen das es sich "zwischen" 2 rechner schaltet, also z.b. Client und IRC Server, damit kann man z.b. die Portsperre an einigen Orten umgehen.
Dazu connecte ich mit meinem Programm zu dem IrcServer und zu einem Irc Client (Trillian etc.), das Problem liegt darin das mein Programm Trillian nicht mitteilt was es vom IrcServer erhält.


Der Fehler liegt irgendwo bei serversocket.Socket.Connections[0].SendText(empfangen), aber ich weiß nicht wie ich es sonst machen kann.


Delphi-Quellcode:
function TMainForm.connect():boolean;
begin
  ServerSocket.Port:=1024;
  ServerSocket.Open;
  if ClientSocket.Active then ClientSocket.Close;
  ClientSocket.host :='irc.spotchat.org';
  ClientSocket.Port :=6667;
  ClientSocket.Open;

end;

procedure TMainForm.ToolButton1Click(Sender: TObject);
begin
  connect;
end;

procedure TMainForm.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var empfangen: string;
begin
  empfangen := Socket.ReceiveText;
  memo1.Lines.Add(empfangen);


  if serversocket.Socket.Connected then serversocket.Socket.Connections[0].SendText(empfangen);  

end;

procedure TMainForm.ToolButton2Click(Sender: TObject);
begin
  ClientSocket.Close;
  ServerSocket.Close;
end;

procedure TMainForm.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var empfangen: string;
begin
  empfangen := Socket.ReceiveText;
  memo1.Lines.Add(empfangen);
  clientsocket.Socket.SendText(empfangen);
end;

procedure TMainForm.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('OnAccept');
  Memo1.Lines.Add(Socket.RemoteAddress +'remoteadress');
  Memo1.Lines.Add(IntToStr(Socket.RemotePort)+'remoteport');
  Memo1.Lines.Add(Socket.LocalAddress+'localadress');
  Memo1.Lines.Add(IntToStr(Socket.LocalPort)+'localport');
end;

Ich danke schonmal im Vorraus für Eure Hilfe.

Net7 17. Okt 2005 23:13

Re: Frage zu SocketServer und senden an einen Client
 
Unabhängig davon, das ich bezweifle das, das was du vorhast überhaupt funktioniert kannst du ja mal
serversocket1.socket.sendtext(empfangen) probieren.

Ich denke aber das Trillian seine Daten übern Buffer auswertet. So das es mit Sendtext nix anfangen kann.

ripper8472 17. Okt 2005 23:23

Re: Frage zu SocketServer und senden an einen Client
 
richtig, sendtext uebertraegt ansistrings, die nur borland und damit entwickelte programme verstehen.

du kannst nicht zu trillian verbinden, trillian muss zu dir verbinden.

an deiner stelle wuerd ich mir noch zwei dummyprogramme schreiben, die als client und server herhalten und definierte daten versenden.

tavoc 18. Okt 2005 06:17

Re: Frage zu SocketServer und senden an einen Client
 
Trillian verbindet ja schon zu meinem Programm, das heißt er greift ja auf die Sockets zu.

Ich erhalte von der Serverkomponente eine Authentifizierung.
Die Daten die gesendet werden sind ja auch definiert, es gibt ja eine RFC fürs IRC, und da man Chatprogramme die sich des IRCs behelfen auch mit den Sockets schreiben kann, sollte es doch auch hier gehen.

@ripper8472 das heißt also ich sollte anstatt der Serverkomponente noch ein Client nehmen?
Das dürfte doch auch nicht gehen da da keine der Seiten (Mein Programm-Trillian) den Server spielt.

flossinger 18. Okt 2005 18:39

Re: Frage zu SocketServer und senden an einen Client
 
Hallo,
was ripper hier schreibt ist nicht richtig:
Zitat:

richtig, sendtext uebertraegt ansistrings, die nur borland und damit entwickelte programme verstehen.
Ganz im Gegenteil, was sendtext() versendet, kann allgemein gelesen werden, WENN DAS RICHTIGE VERSENDET WIRD. Das habe ich auch intensiv getestet: Webapplikationen, in denen ich sendtext verwende, kommunizieren erfolgreich und problemlos mit jedem Webserver und jedem Mailserver.

der Flossinger

ripper8472 18. Okt 2005 19:35

Re: Frage zu SocketServer und senden an einen Client
 
wieder was gelernt :)

@OP: du brauchst einen server, zu dem trillian verbindet und einen client, der zum irc server verbindet.

vom irc protokoll musst du garnichts wissen. du musst nur die daten an beiden seiten durchreichen und gut is.

tavoc 19. Okt 2005 06:31

Re: Frage zu SocketServer und senden an einen Client
 
Könntet Ihr mir noch sagen wo genau das sendtext() hinmuss damit es funktioniert?

So langsam bin ich am verzweifeln, wenn ich jetzt kompilieren würde kommt immer: das das Listenindex überschritten wird.

Wenn ich nur sendtext schreibe kommt: socket nicht verbunden, bei einem sendto wurde keine adresse eingeben fehler 10057.

Ich dachte das der server zu allen seinen clients senden würde...

Net7 19. Okt 2005 17:07

Re: Frage zu SocketServer und senden an einen Client
 
Zitat:

Zitat von tavoc
Könntet Ihr mir noch sagen wo genau das sendtext() hinmuss damit es funktioniert?

So langsam bin ich am verzweifeln, wenn ich jetzt kompilieren würde kommt immer: das das Listenindex überschritten wird.

Wenn ich nur sendtext schreibe kommt: socket nicht verbunden, bei einem sendto wurde keine adresse eingeben fehler 10057.

Ich dachte das der server zu allen seinen clients senden würde...


Nur mal angenommen Trillian wertet ankommende Daten über einen Buffer aus.

Und Clientpaket_empfangen wäre der Buffer.

Das würde in Delphi in etwa so aussehen:

Delphi-Quellcode:
// fiktive Datenannahme von Trillian, mal angenommen  
Socket.ReceiveBuf(Clientpaket_empfangen,sizeof(Clientpaket_empfangen));
Dann wird Dein sendtext() nicht viel bringen, weil du gänzlich einen falschen Typ schickst.

Solange du nicht weißt was du Trillian schicken musst, wirst du scheitern.

Um das herrauszufinden, müstest du schon die Entwickler fragen.

tavoc 19. Okt 2005 21:43

Re: Frage zu SocketServer und senden an einen Client
 
Aber der IRC Server sendet doch auch nur text, ich habe mal nen eigenen client geschrieben und der hat auch alles mit text gemacht, wenn also trillian was anderes erwarten würde müssten ja alle ircserver das auch so senden.

Aber in der rfc steht doch das es text ist.

ripper8472 19. Okt 2005 22:30

Re: Frage zu SocketServer und senden an einen Client
 
ignoriere das. irc ist text, hauptsaechlich.

funktioniert dein programm jetzt?

Net7 19. Okt 2005 22:47

Re: Frage zu SocketServer und senden an einen Client
 
Zitat:

Zitat von tavoc
Aber der IRC Server sendet doch auch nur text, ich habe mal nen eigenen client geschrieben und der hat auch alles mit text gemacht, wenn also trillian was anderes erwarten würde müssten ja alle ircserver das auch so senden.

Aber in der rfc steht doch das es text ist.


Hmmm, also ich hab bissel rumexperimentiert.

So einfach sendtext('blabla') ist schon mal nicht.

Wenn schon sendtext, dann muss es doch zumindest Schritte geben die erst gegangen werden mussen.

Auhtentifizierung, Anmeldung, in einen Channel gehen, Userliste abfragen usw.

Ich schätze das diese Trillian vorraussetzt.

Probiere doch das alles einfach mal mit einen Mirc Clienten. Könnte doch sein das dieser sich anders verhält.

ripper8472 19. Okt 2005 23:07

Re: Frage zu SocketServer und senden an einen Client
 
aehm, trillian ist der client. der sendet anmeldung und joins.

dein programm hat ganz einfach nur die daten durchzureichen.

ich seh das problem nicht. ihr vielleicht?

Net7 20. Okt 2005 00:09

Re: Frage zu SocketServer und senden an einen Client
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von ripper8472
aehm, trillian ist der client. der sendet anmeldung und joins.

dein programm hat ganz einfach nur die daten durchzureichen.

ich seh das problem nicht. ihr vielleicht?

Danke ripper8472 du hast mir einen netten Denkanstoss gegeben.

Na wenns weiter nichts ist.

Beispiel liegt bei.

Zuerst zum gewünschten IRC Server connecten, dann mit Trillian an Tool connecten.

tavoc 20. Okt 2005 08:08

Re: Frage zu SocketServer und senden an einen Client
 
Das problem ist das mein Programm nix an Trillian weiterreicht.

Ich kann also joinen usw., sehe was passiert aber nur in meinem Programm und nicht in Trillian.

Net7 20. Okt 2005 12:16

Re: Frage zu SocketServer und senden an einen Client
 
Zitat:

Zitat von tavoc
Das problem ist das mein Programm nix an Trillian weiterreicht.

Ich kann also joinen usw., sehe was passiert aber nur in meinem Programm und nicht in Trillian.

Also so müste es klappen.

Delphi-Quellcode:

var
MainForm: TForm1;

// Variablen Global
VonIRCempfangen:string
VonTrillianempfangen: string;
Serverstatus:boolean; // hat Server Kontakt mit Trillian ??



function TMainForm.connect():boolean;
begin
 
  // Server für Trillian starten
  ServerSocket.Port:=1024;
  ServerSocket.Active:=true;
 

end;

procedure TMainForm.ToolButton1Click(Sender: TObject);
begin
 
  if ClientSocket.Active=false then
  begin
       ClientSocket.host :='irc.spotchat.org';
        ClientSocket.Port :=6667;
          ClientSocket.Active:=true;
  end
   else
    begin
        ClientSocket.Active:=false;
    end;
end;

procedure TMainForm.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
 
begin
       memo1.Lines.Add(VonIRCempfangen); //Memo darf hier stehen
       VonIRCempfangen:= clientsocket.Socket.ReceiveText;
   
      //!!Memo darf hier auf keinen Fall stehen!!
       if Serverstatus then
        begin
              serversocket.Socket.Connections[0].SendText(VonIRCempfangen);  
              //Memo darf hier stehen
        end;

end;

procedure TMainForm.ToolButton2Click(Sender: TObject);
begin
       ClientSocket.Active:=false;
         ServerSocket.Active:=false;
end;

procedure TMainForm.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
 
begin
         memo1.Lines.Add(VonTrillianempfangen); //Memo darf hier stehen
         
         VonTrillianempfangen:=serversocket.Socket.Connections[0].ReceiveText;
                 
         //!!Memo darf hier auf keinen Fall stehen!!

         clientsocket.Socket.SendText(VonTrillianempfangen);
          //Memo darf hier stehen

end;

procedure TMainForm.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Serverstatus:=true;
  Memo1.Lines.Add('OnAccept');
  Memo1.Lines.Add(Socket.RemoteAddress +'remoteadress');
  Memo1.Lines.Add(IntToStr(Socket.RemotePort)+'remoteport');
  Memo1.Lines.Add(Socket.LocalAddress+'localadress');
  Memo1.Lines.Add(IntToStr(Socket.LocalPort)+'localport');
end;

Würde mich echt wundern wenn es nicht funktionieren würde.

//Edit: Deine Memo dürfen nicht zwischen lesen und an socket senden stehen.
Wenn es dazwischen steht, kommt bei Trillian nix an, wird an der Verzögerung liegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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