你可以看看我們的SynCrtSock
Open Source unit。
它實現了很多功能(包括基於http.sys的HTTP/1.1服務器),但它也有一些虛擬文本文件寫入套接字。它用於例如實現HTTP客戶端或服務器或SMTP(發送電子郵件)。
這將是如何創建「虛擬」TTextRec
的一個很好的示例,其中包括讀取&寫入內容以及處理錯誤。內部緩衝區大小也從默認值增強 - 在這裏默認情況下有1KB的緩存,而不是128個字節。
例如,下面是如何可以用於發送使用SMTP電子郵件(從單元提取源代碼):
function SendEmail(const Server: AnsiString; const From, CSVDest, Subject, Text: TSockData;
const Headers: TSockData=''; const User: TSockData=''; const Pass: TSockData='';
const Port: AnsiString='25'): boolean;
var TCP: TCrtSocket;
procedure Expect(const Answer: TSockData);
var Res: TSockData;
begin
repeat
readln(TCP.SockIn^,Res);
until (Length(Res)<4)or(Res[4]<>'-');
if not IdemPChar(pointer(Res),pointer(Answer)) then
raise Exception.Create(string(Res));
end;
procedure Exec(const Command, Answer: TSockData);
begin
writeln(TCP.SockOut^,Command);
Expect(Answer)
end;
var P: PAnsiChar;
rec, ToList: TSockData;
begin
result := false;
P := pointer(CSVDest);
if P=nil then exit;
TCP := Open(Server, Port);
if TCP<>nil then
try
TCP.CreateSockIn; // we use SockIn and SockOut here
TCP.CreateSockOut;
Expect('220');
if (User<>'') and (Pass<>'') then begin
Exec('EHLO '+Server,'25');
Exec('AUTH LOGIN','334');
Exec(Base64Encode(User),'334');
Exec(Base64Encode(Pass),'235');
end else
Exec('HELO '+Server,'25');
writeln(TCP.SockOut^,'MAIL FROM:<',From,'>'); Expect('250');
ToList := 'To: ';
repeat
rec := trim(GetNextItem(P));
if rec='' then continue;
if pos(TSockData('<'),rec)=0 then
rec := '<'+rec+'>';
Exec('RCPT TO:'+rec,'25');
ToList := ToList+rec+', ';
until P=nil;
Exec('DATA','354');
writeln(TCP.SockOut^,'Subject: ',Subject,#13#10,
ToList,#13#10'Content-Type: text/plain; charset=ISO-8859-1'#13#10+
'Content-Transfer-Encoding: 8bit'#13#10,
Headers,#13#10#13#10,Text);
Exec('.','25');
writeln(TCP.SockOut^,'QUIT');
result := true;
finally
TCP.Free;
end;
end;
它將僅產生安西內容,根據定義。它的目標是德爾福5到XE2 - 所以將包括Delphi 2009或XE。
1不錯捕獲。我猜FPC單元StreamIO大部分是一樣的......但我不確定它會處理Unicode文本。在使用Writeln()時,你可能會用Ansi類型的文本填充。如果您確定目標TStream不會失敗,請不要忘記設置{$ I-}以獲得更快的進程。 – 2012-01-31 15:42:16
相同的單元名稱,相同的函數名稱,我們將採取這一點,非常感謝:-) – 2012-01-31 19:18:11
你可以請提供一些例子如何使用這個單位。 – Branko 2012-02-01 09:08:22