Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TICQClient - Filetransfer (https://www.delphipraxis.net/92469-ticqclient-filetransfer.html)

Neutral General 20. Mai 2007 15:15


TICQClient - Filetransfer
 
Hi,

Ich bekomme den Filetransfair mit der TICQClientkomponente nicht hin.. Ich hab sie schon so modifiziert das man sich einloggen kann und Messages empfangen kann. Muss man da vielleicht noch etwas verändern?

Ich versuche es bisher einfach so:

Delphi-Quellcode:
ICQ.SendFileDC(UIN,Filename,Description);
Wäre für Hilfe sehr dankbar!

Gruß
Neutral General

gsh 20. Mai 2007 15:51

Re: TICQClient - Filetransfer
 
ist auch der gegenseite das entsprechende Port im Router bzw. Firewall freigegeben?

Neutral General 20. Mai 2007 15:53

Re: TICQClient - Filetransfer
 
Ja bei mir funktioniert der Filetransfer... Ich schicke mir ja mit meiner zweiten ICQ nr von MEINEM ICQ-Clienten eine Datei zu meiner Haupt-ICQ-Nummer... Es kommt ja nichtmal diese Anfrage..

alias5000 20. Mai 2007 17:43

Re: TICQClient - Filetransfer
 
So und zu einem Fremdrechner funktioniert dies nicht?

Dann gehts hier wirklich um die Freigabe im Router und/oder Firewall.
Als Beispiel: bei meinem original ICQ (sowie Trillian, Miranda,...) funktioniert der File Transfer auch nicht, weil ich keine Routerfreigabe drinnen habe (verschiedene andere Gründe ;) )

Also schau bitte erstmal danach, falls das wirklich der Fall ist.
Welcher Port das ist, das wird dir die Source vom TICQClient, bzw. Google sicher sagen

Gruß
alias5000

Neutral General 20. Mai 2007 17:55

Re: TICQClient - Filetransfer
 
Zitat:

Zitat von alias5000
So und zu einem Fremdrechner funktioniert dies nicht?

Da hast du etwas falsch verstanden...

Ich sitze hier an einem Rechner.. mit meiner Haupt-ICQ-Nr in ICQ5 und mit meiner Zweit-ICQ-Nr in meinem Programm online.. alles an einem Rechner.. und jetzt will ich von meiner Zweit-ICQ-Nr. eine Datei zu meiner Haupt-ICQ-Nr schicken... Und das funktioniert nicht. Wenn ich das mit ICQ mache und nicht mit meinem Clienten dann ist das kein Problem...

:arrow: ICQ-Filetransfer generell funktioniert!

Also was ich herausgefunden habe:

In TICQClient.SendFileDC wird

Delphi-Quellcode:
fDirect.SetFileRecord(UIN, FileSend);
aufgerufen. Und dort wird auf

Delphi-Quellcode:
fUL
zugegriffen. Da sind irgendwie die Benutzerdaten für den Filetransfer gespeichert. ABER bei mir ist diese Liste leer. Das heißt es geht dort nicht weiter!

Hinzufügen tut man einen solchen Benutzer mit fDirect.AddUser(...). Das weiß ich auch.. Aufgerufen wird diese procedure aber nur ein einziges mal und zwar in

Delphi-Quellcode:
TICQClient.HSnac030B
und das auch nur

Delphi-Quellcode:
case GetInt(Pkt, 2) of
  $0a
TICQClient.HSnac030B wird auch nur ein einziges mal aufgerufen und das in

Delphi-Quellcode:
TICQClient.HandlePacket
Die wird immer aufgerufen wenn ein Paket ankommt.. Aber HSnac030B wird auch nur aufgerufen wenn

Delphi-Quellcode:
case Flap.ChID of
  $03: ...
        case Snac.SubType of
           $0B: {SRV_USERONLINE}
              HSnac030B(Flap, Snac, @pkt);
Und das wird nie aufgerufen

:arrow: fDirect.AddUser wird nie aufgerufen.

fDirect ist ausschließlich privat erreichbar. Jetzt ist die Frage welches Paket da irgendwie ankommen muss und wie ich dafür sorge das ein solches Paket ankommt....

Ich hoffe man konnte das irgendwie verstehn^^

Gruß
Neutral General

Neutral General 21. Mai 2007 13:50

Re: TICQClient - Filetransfer
 
Es gibt neues von der Front :wall:

in der Procedure wo auch AddUser aufgerufen wird

Delphi-Quellcode:
procedure TICQClient.HSnac030B(Flap: TFlapHdr; Snac: TSnacHdr; Pkt: PRawPkt);
wird auch vorher dieser Block ausgeführt:

Delphi-Quellcode:
case GetInt(Pkt, 2) of
    $0c:
    begin
      Inc(Pkt^.Len, 2);                //TLV's Length
      FIntIP := GetLInt(Pkt, 4);       //Internal IP
      FIntPort := GetInt(Pkt, 4);      //Internal port
      FConnFlag := GetInt(Pkt, 1);     //Connection flag
      FProtoVer := GetInt(Pkt, 2);     //Protocol version
      FDconCookie := GetLInt(Pkt, 4);  //Direct connection cookie
      //*eraser 10.03.04
      Inc(Pkt^.Len, 8);                //Skip unknown data
      ICQVersion := GetInt(Pkt, 4);    //time(NULL), ff ff ff ff - Miranda
      MirandaVersion := GetInt(Pkt, 4); //time(NULL), version information
      Inc(Pkt^.Len, 6);                //Skip remaining data
    end;
diese Daten werden dann bei AddUser übergeben:
Delphi-Quellcode:
FDirect.AddUser(StrToInt64(UIN), FDConCookie, FExtIP, FIntIP, FIntPort);
Aus IRGENDEINEM Grund ist FIntPort aber 0 und die IP Adressen alle 0.0.0.0....
Habe herausgefunden das diese Daten nachher gebraucht werden beim Filetransfer.. klar das man sich mit den Daten nirgendwohin verbinden kann......

Es wäre echt nett wenn mir jemand helfen würde. Das ist echt wichtig :X

Gruß
Neutral General

3_of_8 21. Mai 2007 14:09

Re: TICQClient - Filetransfer
 
Also ich glaube, das ICQ grundsätzlich alle File-Transfers von allen Nicht-ICQ-Clients blockt.

Gecko 21. Mai 2007 19:41

Re: TICQClient - Filetransfer
 
Zitat:

Zitat von 3_of_8
Also ich glaube, das ICQ grundsätzlich alle File-Transfers von allen Nicht-ICQ-Clients blockt.

Das ist Unsinn...Filetransfer geht mit Gaim und QIP problemlos...

3_of_8 21. Mai 2007 19:55

Re: TICQClient - Filetransfer
 
Mit Trillian nicht. *kratz*

Und zwar bei niemandem, den ich kenne.

Meflin 21. Mai 2007 19:58

Re: TICQClient - Filetransfer
 
Zitat:

Zitat von 3_of_8
Mit Trillian nicht. *kratz*
Und zwar bei niemandem, den ich kenne.

Wahnsinn. Dann kennst du jetzt einen :roll: Natürlich funktioniert das, wenn man schlau genug ist seinen Router im Griff zu haben...

Mit der TICQClient-Komponente würde ich mich aber nicht länger abplagen. Die ist doch heillos veraltet :?


Daniel G 21. Mai 2007 20:06

Re: TICQClient - Filetransfer
 
Zitat:

Zitat von 3_of_8
Mit Trillian nicht. *kratz*

Und zwar bei niemandem, den ich kenne.

Sicher, dass es unbedingt an Trillian liegt? :mrgreen:
@Topic: Kann es evtl. auch daran liegen, dass ja vor nicht allzu langer Zeit mal wieder das Protokoll/die Version geändert wurde?

F0rc3 12. Jun 2007 14:05

Re: TICQClient - Filetransfer
 
[quote="Meflin"]
Zitat:

Zitat von 3_of_8
Mit der TICQClient-Komponente würde ich mich aber nicht länger abplagen. Die ist doch heillos veraltet :?


Hm, hab auch ein paar Probleme den Filetransfer hinzukriegen ^^

Allerdings ist TICQClient die einzige Komponente die ich kenne und auch noch halbwegs funktioniert - welche würdest du denn nehmen?

alias5000 12. Jun 2007 19:58

Re: TICQClient - Filetransfer
 
So gesehen selber implementieren ;)

Was anderes als TICQLib kenne ich auch nicht direkt. Nur die Plugins von Miranda sind IMHO auch in Delphi geschrieben. Müssten auch Open- Source sein

Meflin 12. Jun 2007 20:00

Re: TICQClient - Filetransfer
 
Zitat:

Zitat von F0rc3
Allerdings ist TICQClient die einzige Komponente die ich kenne und auch noch halbwegs funktioniert - welche würdest du denn nehmen?

Es ist die einzige die ich kenne ;)

Allerdings gibt es ja bei sourceforge im Bugtracker und zugehörigen Forum ein paar Workarounds, vielleicht ist es damit mit vertretbarem Zeitaufwand möglich das ganze zum funktionieren zu bringen, ich weiß es nicht, denn ich habe es noch nicht ausprobiert...

Schade dass sich der Autor nicht länger darum kümmert, aber auch irgendwo verständlich :(


F0rc3 13. Jun 2007 18:52

Re: TICQClient - Filetransfer
 
hab jetzt endlich rausbekommen, wie man eingehende Filetransfers akzeptieren kann: :)

Delphi-Quellcode:
procedure TForm1.ICQClient1FTRequest(Sender: TObject;
  RequestRec: TFTRequestRec);
begin
ICQClient1.FTResponse(RequestRec, True, '');
end;
Alelrdings wird die Datei nicht übertragen, da dann noch kein Ergeignis deklariert wurde was passiert wenn der Filetransfer gestartet wird (Miranda zeigt an: Moving to next file, es wird also auf eine Reaktion vom Empfänger gewartet)

Wahrscheinlich kann man das über folgende Procedures das irgendwie selbst hinkriegen:

Delphi-Quellcode:
procedure TForm1.ICQClient1FTInit(Sender: TObject; UIN, FileCount, TotalBytes,
  Speed: Cardinal; NickName: string);
begin

end;

procedure TForm1.ICQClient1FTFileData(Sender: TObject; UIN: Cardinal;
  Data: Pointer; DataLen: Cardinal; LastPacket: Boolean);
begin

end;

procedure TForm1.ICQClient1FTStart(Sender: TObject; StartRec: TFTStartRec;
  FileName: string; FileSize, Speed: Cardinal);
begin

end;
Hat jemand eine Idee??


/edit: mit

Delphi-Quellcode:
procedure TForm1.ICQClient1FTStart(Sender: TObject; StartRec: TFTStartRec;
  FileName: string; FileSize, Speed: Cardinal);
begin
icqclient1.FTStartResponse(startrec);
end;
Startet man den Filetransfer - allerdings ist sozusagen ein "Dummy-Transfer", da man ja nicht gesagt hat wohin die Datei gespeichert werden soll...

F0rc3 13. Jun 2007 20:16

Re: TICQClient - Filetransfer
 
*freu* hab herausgefunden, wie man zumindestens eine Datei mit der TICQlib empfängt :)

Delphi-Quellcode:
 var  uppto: string;
  _file: TFilestream;

implementation

procedure TForm1.ICQClient1FTStart(Sender: TObject; StartRec: TFTStartRec;
  FileName: string; FileSize, Speed: Cardinal);
begin
  _file := TFilestream.Create(uppto, fmCreate);
  icqclient1.FTStartResponse(startrec);
end;


procedure TForm1.ICQClient1FTRequest(Sender: TObject;
  RequestRec: TFTRequestRec);
begin
  if uppto <> '' then
  begin
    icqclient1.FTResponse(requestrec, true, 'Copying the file to' + uppto);
    timer2.Enabled := false;
  end
  else
  begin
    icqclient1.FTResponse(requestrec, false,
      'Please use the PUT-command first!');
    icqclient1.SendMessage(requestrec.UIN, 'Please use the PUT-command first!')
  end;
end;

procedure TForm1.ICQClient1FTFileData(Sender: TObject; UIN: Cardinal;
  Data: Pointer; DataLen: Cardinal; LastPacket: Boolean);
begin
  _file.Write(data^, datalen);
  if lastpacket then
    timer3.Enabled := true;
end;


procedure TForm1.Timer3Timer(Sender: TObject);
begin
  timer3.Enabled := false;
  _file.Free;
end;

Das mit dem Timer ist zwar DirtyProgramming, allerdings kam immmer eine Fehlermeldung wenn ich das .free zu dem if lastpacket geschrieben habe (auch mit try-finally), deshalb der Timer...




...Was ich aber immer noch nicht herausgefunden habe, ist wie man eine Datei an jemanden schickt - immer wenn ich SendFileDC benutzt habe passierte rein gar nichts - kann da vllt einer helfen? *pleeeease*


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