Entwickler-Ecke

Internet / Netzwerk - Indy IRC + Datei empfangen und versenden.


Waterball - Di 24.02.09 09:07
Titel: Indy IRC + Datei empfangen und versenden.
Hallo...

ich sitze jetzt seid Stunden vor dem problem das ich mit Indy keine Dateien empfangen oder senden kann.

Delphi-Quelltext
1:
IdIRC1.SendCmd('PRIVMSG '+ANick+' :'+#1+'DCC ACCEPT '+AFileName+' '+LongIP(IP)+' '+APort+' '+AFileSize+#1);                    


Selbst damit, merkt "mIRC" nicht das ich den empfang der Datei möchte.
Ich habe schon versucht VIA IdTCPClient es zu realisieren, leider bin ich auch daran gescheitert...

Hat vllt jemand eine Idee...? oder vllt sogar ein Beispielt...?

Ich wäre euch sehr verbunden...


MfG
Waterball

Moderiert von user profile iconNarses: Highlight- durch Delphi-Tags ersetzt


Xentar - Di 24.02.09 11:57

Wo hast du denn den Aufbau, den du da sendest, her? Sicher, dass dieser korrekt ist?


Waterball - Di 24.02.09 19:00

Das habe ich in einer IRC Wiki gefunden....
Und ja, soweit ich es sehen konnte war dieser Korrekt. Habe auch ein paar OpenSource Programme gefunden die funktionieren und wo dieser Teil auch klappt...

Soweit klappt alles... mein Programm merkt das jemand nen DCC senden will...
Aber sobald ich empfange das es jemand machen möchte, laggt das programm ein wenig. Aber passieren tut nichts :(


MfG
Waterball


Xentar - Di 24.02.09 20:09

user profile iconWaterball hat folgendes geschrieben Zum zitierten Posting springen:
Soweit klappt alles... mein Programm merkt das jemand nen DCC senden will...
Aber sobald ich empfange das es jemand machen möchte, laggt das programm ein wenig. Aber passieren tut nichts :(

Was soll denn auch passieren? Mit obigem Quellcode sagst du doch nur, dass du die Datei akzeptierst.. aber abspeichern o.ä. tust du die mit dieser einen Zeile wohl nicht.
Wo hast du den Code überhaupt stehen?


Waterball - Di 24.02.09 21:05

Den Code habe ich im teil, wo Indy merkt, das eine Datei ankommen möchte...
Aber nicht einmal das akzeptieren geht... die gegenseite bekommt nicht mit, das der Datei empfang stattfinden soll...

mfg
Waterball


DennisHB - Do 05.03.09 00:15

Moin,

stand vor dem selben Problem...

hab darauf hin nen kleinen Thread zusammen gefrickelt der zumindest bei mir local (Server:InspiRCd + Sender:mIRC) funktioniert (Empfänger:Indy 9)
online ist das ganze noch nicht getestet... da ich an einigen stellen noch zu tun habe und ich keinem zumuten möchte nen "defekten" IRC-Client auf seinem Server zu haben.

Das ganze ist eher Beta, wenn nicht Alpha... aber ich denke es gibt nen kleinen Gedankenschub in die richtige Richtung.

Aufruf:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.ClientDCCSend(Sender: TObject; ANick, AIp, APort, AFileName, AFileSize: string);
var
     reciveThread   : TmyIRCdccReceive;
begin
// Überprüfen ob "ANick" senden darf - Vorsicht
...
//--
     reciveThread := TmyIRCdccReceive.Create(AIp, APort, AFileName, AFileSize);
     reciveThread.DownloadDir := 'D:\Downloads\';
     reciveThread.FreeOnTerminate := true;
// Ab hier halt entsprechende EventHandler vorbereiten
     reciveThread.OnConnected := ClientConnect;
     reciveThread.OnDisconnected := ClientDisconnected; 
     reciveThread.OnStatus := ClientStatus;
     reciveThread.OnWork := tcpWork;
     reciveThread.OnWorkBegin := tcpWorkBegin;
     reciveThread.OnWorkEnd := tcpWorkEnd;
//--

     reciveThread.Resume; // Dem ganzen nun Leben einhauchen (starten)
end;


Edit : hmm Dateianhang mag mich nicht:


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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
unit threadMyIRCdccReceive;

interface

uses
     // Indy Stuff
     IdTCPClient, IdComponent,

     Classes, SysUtils;

type
     TmyIRCdccReceive = class(TThread)
     private
          tcp: TIdTCPClient;
          FDownloadDir: string;
          FFileName: string;
          FExpectedFileSize: Int64;

          // Temp Sync Vars
          fTCPStatus: TIDStatus;
          fTCPStatusText: string;
          fTCPWorkMode: TWorkMode;
          fTCPWorkCount: Integer;
          fTCPWorkCountMax: Integer;

          // Internal EventNotifier
          FOnWorkBegin: TWorkBeginEvent;
          FOnWorkEnd: TWorkEndEvent;
          FOnWork: TWorkEvent;
          FOnStatus: TIdStatusEvent;
          FOnDisconnected: TNotifyEvent;
          FOnConnected: TNotifyEvent;

          procedure SetDownloadDir(const Value: string);

          // Internal Event Handler
          procedure DoTCPConnected(Sender: TObject);
          procedure DoTCPDisconnected(Sender: TObject);
          procedure DoTCPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
          procedure DoTCPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
          procedure DoTCPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
          procedure DoTCPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
     protected
          procedure Execute; override;

          // Sync Procs to Notify Parent/Main Process
          procedure syncTCPConnect;
          procedure syncTCPDisconnect;
          procedure syncTCPStatus;
          procedure syncTCPWork;
          procedure syncTCPWorkBegin;
          procedure syncTCPWorkEnd;
     public

          property DownloadDir: string read FDownloadDir write SetDownloadDir;
          property FileName: string read FFileName write FFileName;

          // Event Notifier
          property OnConnected: TNotifyEvent read FOnConnected write FOnConnected;
          property OnDisconnected: TNotifyEvent read FOnDisconnected write FOnDisconnected;
          property OnStatus: TIdStatusEvent read FOnStatus write FOnStatus;
          property OnWork: TWorkEvent read FOnWork write FOnWork;
          property OnWorkBegin: TWorkBeginEvent read FOnWorkBegin write FOnWorkBegin;
          property OnWorkEnd: TWorkEndEvent read FOnWorkEnd write FOnWorkEnd;

          constructor Create(AIp, APort, AFileName, AFileSize: string);
     end;

implementation

constructor TmyIRCdccReceive.Create(AIp, APort, AFileName, AFileSize: string);
begin
     // Create Inherited Suspended
     inherited Create(true);

     FExpectedFileSize := StrToInt(AFileSize);

     // Init TCP
     tcp := TidTCPClient.Create(nil);
     tcp.Host := AIp;
     tcp.Port := StrToInt(APort);
     tcp.OnConnected := DoTCPConnected;
     tcp.OnDisconnected := DoTCPDisconnected;
     tcp.OnWork := DoTCPWork;
     tcp.OnWorkBegin := DoTCPWorkBegin;
     tcp.OnWorkEnd := DoTCPWorkEnd;
     tcp.OnStatus := DoTCPStatus;

     FFileName := AFileName;
end;

procedure TmyIRCdccReceive.DoTCPConnected(Sender: TObject);
begin
     Synchronize(syncTCPConnect);
end;

procedure TmyIRCdccReceive.DoTCPDisconnected(Sender: TObject);
begin
     Synchronize(syncTCPDisconnect);
end;

procedure TmyIRCdccReceive.DoTCPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
begin
     fTCPStatus := AStatus;
     fTCPStatusText := AStatusText;
     Synchronize(syncTCPStatus);
end;

procedure TmyIRCdccReceive.DoTCPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
     fTCPWorkMode := AWorkMode;
     fTCPWorkCount := AWorkCount;
     Synchronize(syncTCPWork);
end;

procedure TmyIRCdccReceive.DoTCPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
     fTCPWorkMode := AWorkMode;
     fTCPWorkCountMax := AWorkCountMax;
     Synchronize(syncTCPWorkBegin);
end;

procedure TmyIRCdccReceive.DoTCPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
     fTCPWorkMode := AWorkMode;
     Synchronize(syncTCPWorkEnd);
end;

procedure TmyIRCdccReceive.Execute;
var
     AFileStream    : TFileStream;
     streamSize     : Int64;
begin
     AFileStream := TFileStream.Create(FFileName, fmCreate);
     tcp.Connect();
     streamSize := 0;
     tcp.ReadStream(AFileStream, FExpectedFileSize, false);
     tcp.Disconnect;
     AFileStream.Free;
end;

procedure TmyIRCdccReceive.SetDownloadDir(const Value: string);
begin
     FDownloadDir := Value;
     FFileName := ExtractFilePath(FDownloadDir) + ExtractFileName(FFileName);
end;

procedure TmyIRCdccReceive.syncTCPConnect;
begin
     if assigned(FOnConnected) then begin
          FOnConnected(tcp);
     end;
end;

procedure TmyIRCdccReceive.syncTCPDisconnect;
begin
     if assigned(FOnDisconnected) then begin
          FOnDisconnected(tcp);
     end;
end;

procedure TmyIRCdccReceive.syncTCPStatus;
begin
     if assigned(FOnStatus) then begin
          FOnStatus(tcp, fTCPStatus, fTCPStatusText);
     end;
end;

procedure TmyIRCdccReceive.syncTCPWork;
begin
     if assigned(FOnWork) then begin
          FOnWork(tcp, fTCPWorkMode, fTCPWorkCount);
     end;
end;

procedure TmyIRCdccReceive.syncTCPWorkBegin;
begin
     if assigned(FOnWorkBegin) then begin
          FOnWorkBegin(tcp, fTCPWorkMode, fTCPWorkCountMax);
     end;
end;

procedure TmyIRCdccReceive.syncTCPWorkEnd;
begin
     if assigned(FOnWorkEnd) then begin
          FOnWorkEnd(tcp, fTCPWorkMode);
     end;
end;

end.