Allgemein Literatur Links Bugs Versionen |
Allgemein
Zu Zeiten von Delphi 2 und 3 gab es keine brauchbaren freien Internet-Komponenten
für Delphi, die OCXe hätte Borland lieber weggelassen. Zufällig entdeckte ich
damals ein sehr guten Buch über die TCP/IP-Programmierung mit
Delphi, mit dem ich binnen weniger Wochen eine ganze Reihe von Komponenten lauffähig
hatte. All die meist benutzten Dienste habe ich implementiert
- Finger (Client und Server), HTTP (inklusive "post", Unterstützung für Proxies, und
basic authentication), FTP,
time, RExec, RSh, lpr,
POP3, SMTP und Mail (inklusive MIME für Dateianhänge), sowie NNTP und News.
Da Version 0.2 der Komponenten schon sehr stabil liefen, habe ich danach
damit angefangen, sie auf asynchrone Winsock-Aufrufe umzubauen - was sich aber
als Büchse der Pandora herausstellte, denn dadurch wurden die Komponenten sehr
viel aufwendiger und instabiler. So habe ich sie auch auf Zeitmangel nicht so
stabil bekommen, daß ich sie guten Gewissens veröffentlichen konnte - und außerdem
gibt es mittlerweile auch einige andere Komponente, u.a. die Open Source Indy
Komponenten.
Aber natürlich ist das letzte stabile Release weiterhin verfügbar, zusammen mit einem Patch der die wichtigsten Bugs korrigiert. Ebenfalls im Patch-Archiv enthalten ist eine Fassung der Unit winsock, die sowohl statisches als auch dynamisches Laden der DLL erlaubt. Allerdings sollte diese Unit nur mit Delphi 1 oder 2 verwendet werden, ansonsten bekommt man sehr schnell Package-Inkompatibilitäten.
TCP/IP Komponenten V0.2 (Zip-Archive, 80kB)
Patch (0.22) (Zip-Archiv, 37kB)
Building Internet Applications with Delphi 2 von Davis Chapman et.al. Que Publishing, ISBN 0789707322 | Leider ist dies Buch schon lange nicht mehr verfügbar, und die Autoren haben auch keine Neuauflage geschrieben, so daß es Glücksache ist dies Buch noch irgendwo zu bekommen. Entgegen dem Buchtitel läßt es sich auch mit anderen Delphi-Versionen verwenden, nur das Kapitel über die Netscape-API dürfte ziemlich obsolete sein. Dabei ist das Buch mehr für den fortgeschrittenen Programmierer geschrieben, der direkt auf der Protokoll-Ebene programmieren möchte, nicht für denenigen, der nur fertige Internet-Komponenten verwenden will. | |
Delphi für das Internet von Lino Tadros, Lance Bullock, Steve Teixeira Software & Support, ISBN 3935042078 | Steve Texeira ist schon seit längerem als Autor des Delphi Developers Guide bekannt, einem sehr guten Buch das deutlich über dem üblichen Niveau der Delphi-Einsteiger-Bücher liegt und damit auch die Tiefen der Programmierung behandelt. Daher klingt dieses in Kürze erscheinende Buch sehr vielversprechend und könnte ein Ersatz für obiges Buch werden - besonders positiv ist daß es eine deutsche Ausgabe geben wird. Nur leider verzögert sich das Buch schon seit einem Jahr, im Moment ist die englische Ausgabe Delphi/Kylix Internet Developer's Guide für Februar 2003 angekündigt. |
Links
Bugs of V0.2
Die folgenden Bugs sind mit dem Update
behoben, wer mag kann natürlich die folgenden Patches benutzen.
Die folgende Stelle erzeugt beim Compilieren mit Delphi 4 einen Fehler.
(*$ifndef ver100 *)
temp_socket:=Winsock.Accept(Socket,LocalAddress,x);
(*$else *) { Delphi 3 ARGH! }
temp_socket:=Winsock.Accept(Socket,@LocalAddress,@x);
(*$endif *)
Grund ist das mit Delphi 3 geänderte Interface der accept-Funktion,
jedoch funktioniert die Unterscheidung zwischen den beiden Versionen
mittels des ifdef nicht mehr mit Delphi 4. Die schnelle Lösung:
den (*$ifdef ver100*) durch (*$ifdef ver120*) (bzw. das
jeweilige Äquivalent) ersetzen.
Allerdings compiliert es dann nicht mehr mit Delphi 3.
Wenn mehr als eine IP-Adresse im System gültig ist (z.B. bei einem
lokalen Netz und einer RAS-Verbindung zum Internet) kann es vorkommen,
daß beim FTP-Kommando PORT die falsche IP-Adresse übermittelt
wird, zu der der Server dann nicht verbinden kann.
Fix: In der Methode t_ftp.Get_datasocket einfach die
Zeile
ip:=my_ip_address;
mit diesem Code ersetzen
l:=SizeOf(LocalAddress);
if winsock.GetSockName(f_comm_socket,LocalAddress,l)<>SOCKET_ERROR then
ip:=LocalAddress.Sin_addr.S_addr
else
ip:=my_ip_address;
und bei den Variablendeklarationen dieser Methode diese beiden hinzufügen
var
l: longint;
LocalAddress: TSockAddr;
Die folgenden Zeilen jeweils als erste in T_Mail.destroy
if f_smtp<>NIL then
f_smtp.RemoveFromNotify(self);
bzw. T_News.destroy einfügen
if f_nntp<>NIL then
f_nntp.RemoveFromNotify(self);
Dieses Problem tritt bei virtuellen Webservern auf, bei denen der eigentliche
HTTP-Aufruf die komplette URL anstatt einer relativen enthalten muß.
Obwohl T_HHTP standardmäßig nur die relative URL benutzt, kann
man ihn dazu zwingen, die gesamte URL zu benutzen indem man die
Eigenschaft proxy entsprechend setzt. Z.B. für
www.hoerstemeier.com muß
proxy auf www.hoerstemeier.com:80 gesetzt werden.
Einige Server verlangen das eigentlich erst mit HTTP1.1 definierte
Headerfeld "Host", um dieses mitzusenden in t_http.sendrequest
die folgende Zeile als zweite Zeile (hinter dem SendCommand) einfügen
SendCommand('Host: '+f_hostname);
Wird ein richtiger Proxy benutzt ist dieses nicht nötig.
Workaround: Beim Löschen von Komponenten die Reihenfolge T_Mime, T_Mail/T_News, T_SMTP/T_NNTP einhalten.
Workaround: die Zeile dispatch(Msg) in t_tcpip.WndProc auskommentieren
Workaround: Beim Usernamen ein #0 als erstes Zeichen hinzufügen
Workaround: das erste Zeichen des Streams überlesen, z.B. mit dem folgenden Code:
var c:char;
TMemoryStream(RExec1.stream).Read(c,1);
if c=#0 then
TMemoryStream(RExec1.stream).seek(1,0)
else
TMemoryStream(RExec1.stream).seek(0,0);
memo1.loadFromStream(REXec1.stream);
Workaround:vor jedem Aufruf der action-Methode ein
TMemoryStream(RExec1.Stream).Seek(0,0) machen.
Die WM_QUERYCLOSESESSION Message wird nicht richtig bearbeitet
Work around: Den folgenden Code in t_tcpip.wndproc einfügen:
if msg.msg=wm_queryendsession then
msg.result:=1;
Grund: AddExitProc macht mit packages Probleme
Workaround: Die Datei ip_misc.pas aus dem Patch nehmen.
Date | Version | Changes |
---|---|---|
1997-05-21 | 0.1b | erste veröffentlichte Version, TTime, THTTP, TFTP, TSMTP, TNNTP, TPop3, TRExec, TMail, TNews, TMime, TFinger, TFingerD, Tlpr |
1997-07-02 | 0.2b | Bugfixes OnTrace-Events hinzugefügt |
Letzte Änderung 2002-04-17