自创改编小控件,不是一个哟!!
仔细看一下,你一定会喜欢的!
unit tcpip;
(*@/// interface *)interface (*$x+ *)
(*@/// uses *)uses sysutils, classes, controls, forms, winsock,(*$ifdef ver80 *) winprocs, wintypes,(*$else *) windows,(*$endif *) messages, ip_misc;(*@///*)
type t_socket_state = (invalid,valid,connected,state_unknown); t_timemode = (tzUTC,tzLocal); t_ftp_mode = (tftp_download,tftp_upload,tftp_getdir); t_filetype = (ft_none, ft_dir, ft_file, ft_link); t_lpr_types = (lp_plain, lp_ascii, lp_dvi, lp_plot, lp_ditroff, lp_ps, lp_pr, lp_fortran, lp_troff, lp_raster, lp_cif); t_encoding = (ec_base64, ec_quotedprintable, ec_none); TTraceLevel = (tt_proto_sent, tt_proto_get, tt_socket);(*@/// t_filedata=record ... end; *)t_filedata=packed record filetype: t_filetype; size: integer; name: string; datetime: TDateTime; end;(*@///*) ETcpIpError=class(Exception);(*@/// ESocketError=class(ETcpIpError) *)ESocketError=class(ETcpIpError) errornumber: word; constructor Create(number:word); end;(*@///0000000301*)(*@/// EProtocolError=class(ETcpIpError) *)EProtocolError=class(ETcpIpError) errornumber: word; protocoll: string; constructor Create(const proto,Msg:String; number:word); end;(*@///0000000401*)(*@/// EProtocolBusy=class(ETcpIpError) *)EProtocolBusy=class(ETcpIpError) constructor Create; end;(*@///0000000201*)
TTraceProc = procedure (const s:string; level:TTraceLevel) of object; TDataTransferProc = procedure (Sender:TObject; mode: t_ftp_mode; bytes: integer) of object; TFTPActionCompleteProc = procedure (Sender:TObject; mode: t_ftp_mode) of object;
{ The base component }(*@/// T_TcpIp = class(TComponent) *)T_TcpIp = class(TComponent)protected f_handle: THandle; f_Socket: tsocket; f_hostname: string; f_tracer: TTraceProc; f_socket_number: smallint; ip_address: longint; (* Network order! *) f_eof: boolean; f_newdata: boolean; f_stream: TStream; f_buffer: pointer; f_async: boolean; f_logged_in: boolean; procedure WndProc(var Msg : TMessage); virtual; function Create_Socket:TSocket; procedure connect_socket(var socket:TSocket; Socket_number:smallint;ip_address:longint); procedure bind_socket(var socket:TSocket; out_port_min,out_port_max: word); procedure open_socket_out(var socket:TSocket; Socket_number:smallint;ip_address:longint); virtual; procedure open_socket_in(var socket:TSocket; Socket_number:smallint;ip_address:longint); procedure close_socket(var socket:TSocket); procedure close_socket_linger(var socket:TSocket); function accept_socket_in(socket:TSocket; var SockInfo:TSockAddr):TSocket; function socket_state(socket:TSocket):T_Socket_State; function Socket_by_name(const service:string):smallint; function read_line(f_socket:TSocket):string; procedure read_var(f_socket:TSocket; var buf; size:integer; var _ok:integer); procedure write_buf(f_socket:TSocket; const buf; size:integer); procedure write_s(f_socket:TSocket; const s:string); procedure SetStream(value:TStream); (* for the property write of f_stream *) procedure action; VIRTUAL;{ property Async:boolean read f_async write f_async default false; } procedure SendCommand(const s:string); VIRTUAL;public procedure Login; virtual; procedure Logout; virtual; property OnTrace:TTraceProc read f_tracer write f_tracer; constructor Create(Aowner:TComponent); override; destructor Destroy; override; function eof(f_socket:TSocket):boolean; VIRTUAL; end;(*@///0000002901*)
{ Finger client and demon // RFC 1288 }(*@/// T_Finger = class(T_TcpIp) *)T_Finger = class(T_TcpIp)protected f_user: string;public constructor Create(Aowner:TComponent); override; property stream: TStream read f_stream; procedure action; override;published property Hostname: string read f_hostname write f_hostname; property User: string read f_user write f_user; end;(*@///0000000118*)(*@/// T_Fingerd = class(T_TcpIp) *)type(*@/// TFingerInfo=record *)TFingerInfo=record hostname: string; address: longint; request: string; end;(*@///0000000203*) TFingerRequest=procedure (Sender:TObject; FingerInfo:TFingerInfo) of object;
T_Fingerd = class(T_TcpIp)protected f_fingerrequest: TFingerRequest; f_answer: TStringList; procedure WndProc(var Msg : TMessage); override; procedure SetAnswer(Value: TStringList); procedure do_action; virtual; (* The real action *)public constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; override; (* Only to set up *)published property OnFingerRequest:TFingerRequest read f_fingerrequest write f_fingerrequest; property Answer: TStringList read f_answer write SetAnswer; end;(*@///0000000503*)
{ HTTP and FTP - the file transfer protocols }(*@/// T_HTTP = class(T_TcpIp) // RFC 1945 (V1.0), RFC 2068 (V1.1) *)T_HTTP = class(T_TcpIp)protected f_url: string; f_path: string; (* The real request string, calculated internally *) f_proxy: string; f_sender: string; f_reference: string; f_agent: string; f_nocache: boolean; f_status_nr: integer; f_status_txt: string; f_size: integer; f_type: string; f_author: string; f_do_author: TStringList; f_content_post: string; procedure GetHead; procedure GetBody; procedure sendrequest(const method,version: string); procedure getanswer;public property stream: TStream read f_stream write SetStream; property content_size: integer read f_size; property content_type: string read f_type; property status_number: integer read f_status_nr; property status_text: string read f_status_txt; procedure action; override; (* the GET method *) procedure Post; (* the POST method, untested! *) constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure DoBasicAuthorization(const username,password:string); property AuthorizationRequest: TStringList read f_do_author; property Authorization: string read f_author write f_author;published property URL: string read f_url write f_url; property Proxy: string read f_proxy write f_proxy; property Sender: string read f_sender write f_sender; property Agent: string read f_agent write f_agent; property Reference: string read f_reference write f_reference; property NoCache: boolean read f_nocache write f_nocache; property ContentTypePost: string read f_content_post write f_content_post; property OnTrace; end;(*@///0000000C01*)(*@/// T_FTP = class(T_TcpIp) // RFC 959 *)T_FTP = class(T_TcpIp)protected f_url: string; f_status_nr: integer; f_status_txt: string; f_user: string; f_password: string; f_comm_socket: tsocket; f_passive: boolean; f_port: word; f_mode: t_ftp_mode; f_mode_intern: t_ftp_mode; f_cur_dir: TStringList; f_cur_dir_index: integer; f_size: integer; f_busy: boolean; f_onaction: TFTPActionCompleteProc; f_ondata_got: TDataTransferProc; f_dir_stream: TMemoryStream; f_async_data: boolean; procedure response; function read_line_comm:string; procedure SendCommand(const s:string); override; procedure get_datasocket; procedure WndProc(var Msg : TMessage); override; function do_write:boolean; function do_read:boolean; procedure finish_upload; procedure finish_download; procedure finish_getdir;public (* will become public once tested *) procedure changedir(const f_dir:string); procedure removefile(const filename:string); procedure removedir(const dirname:string); procedure makedir(const dirname:string); procedure renamefile(const prior,after:string); procedure getdir(const dirname:string); function getdirentry:t_filedata;public property stream: TStream read f_stream write SetStream; property status_number: integer read f_status_nr; property status_text: string read f_status_txt; property busy: boolean read f_busy; procedure login; override; procedure logout; override; procedure download; procedure upload; procedure abort; procedure noop; constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; override; property Size:integer read f_size;published property Hostname: string read f_hostname write f_hostname; property URI: string read f_url write f_url; property Password:string read f_password write f_password; property Username:string read f_user write f_user; property Passive:boolean read f_passive write f_passive default true; property Port:word read f_port write f_port default 21; property Mode:t_ftp_mode read f_mode write f_mode default tftp_download; property OnDataReceived:TDataTransferProc read f_ondata_got write f_ondata_got; property OnActionComplete:TFTPActionCompleteProc read f_onaction write f_onaction; property Async:boolean read f_async_data write f_async_data; property OnTrace;end;(*@///0000003501*)
{ Time, RExec, LPR - the most useful UNIX services }(*@/// T_Time = class(T_TcpIp) // RFC 868 *)T_Time = class(T_TcpIp)protected f_time: TDateTime; f_timemode: T_TimeMode;public constructor Create(Aowner:TComponent); override; procedure action; override; property time: TDateTime read f_time;published property Hostname: string read f_hostname write f_hostname; property TimeMode: T_TimeMode read f_timemode write f_timemode default tzUTC; end;(*@///0000000103*)(*@/// T_RCommon = class(T_TcpIp) *)T_RCommon = class(T_TcpIp)protected procedure open_socket_out(var socket:TSocket; Socket_number:smallint;ip_address:longint); override;public procedure action; override; property stream: TStream read f_stream;published property Hostname: string read f_hostname write f_hostname; end;(*@///0000000103*)(*@/// T_RExec = class(T_RCommon) *)T_RExec = class(T_RCommon)protected f_user: string; f_pass: string; f_command: string; procedure login; override;public constructor Create(Aowner:TComponent); override;published property UserName: string read f_user write f_user; property Password: string read f_pass write f_pass; property Command: string read f_command write f_command; end;(*@///0000000113*)(*@/// T_Rsh = class(T_RCommon) *)T_Rsh = class(T_RCommon)protected f_user_r: string; f_user_l: string; f_command: string; procedure login; override;public constructor Create(Aowner:TComponent); override;published property LocalUser: string read f_user_l write f_user_l; property RemoteUser: string read f_user_r write f_user_r; property Command: string read f_command write f_command; end;(*@///0000000111*)(*@/// T_lpr = class(T_TcpIp) // RFC 1179 *)T_lpr = class(T_TcpIp)protected f_printtype: t_lpr_types; f_banner: boolean; f_count: integer; f_user: string; f_queue: string; f_user_mail: string; f_jobname: string; f_title: string; procedure response; procedure open_socket_out(var socket:TSocket; Socket_number:smallint;ip_address:longint); override;public constructor Create(Aowner:TComponent); override; property stream: TStream read f_stream write SetStream; procedure action; override; procedure SendPrintData; procedure GetQueueStatus(detailed:boolean);published property Hostname: string read f_hostname write f_hostname; property User: string read f_user write f_user; property PrintQueue: string read f_queue write f_queue; property MailTo: string read f_user_mail write f_user_mail; property JobName: string read f_jobname write f_jobname; property PrintType:t_lpr_types read f_printtype write f_printtype default lp_ascii; property CopyCount:integer read f_count write f_count default 1; property PrintBanner:boolean read f_banner write f_banner default false; property PrintTitle:string read f_title write f_title; end;(*@///0000000103*)
{ The Mail and News protocols }(*@/// T_SMTP = class(T_TcpIp) // RFC 821 *)T_SMTP = class(T_TcpIp)protected f_user, f_host: string; f_status_nr: integer; f_status_txt: string; f_receipts, f_body: tstringlist; procedure SetBody(Value: TStringList); procedure SetRecipients(Value: TStringList); procedure response;public constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; override; property Recipients: TStringlist read f_receipts write SetRecipients; property Message: TStringList read f_body write SetBody; property Sender: string read f_user write f_user;published property Hostname: string read f_hostname write f_hostname; property OnTrace; end;(*@///0000001001*)(*@/// T_Pop3 = class(T_TcpIp) // RFC 1725 *)T_Pop3 = class(T_TcpIp)protected f_user: string; f_pass: string; f_list: TList; f_mail: TStringList; procedure response;public property Mail: TStringlist read f_mail; constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; override; (* retrieval of first message *) procedure Login; override; procedure GetHeaders; procedure Logout; override; procedure GetMail(index: integer); procedure DeleteMail(index:integer);published property Hostname: string read f_hostname write f_hostname; property UserName: string read f_user write f_user; property Password: string read f_pass write f_pass; property OnTrace;end;(*@///0000001701*)(*@/// T_NNTP = class(T_TcpIp) // RFC 977 *)T_NNTP = class(T_TcpIp)protected f_news: TStringList; f_newsgroups: TStringList; f_status_nr: integer; f_status_txt: string; procedure response; procedure action; override; (* ??? *) procedure SetNews(value:TStringlist); procedure GetArticleInternally;public property News: TStringlist read f_news write SetNews; property NewsGroups: TStringlist read f_newsgroups; constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure Login; override; procedure Logout; override; (* To get an article from a URL like nntp://hostname/number *) procedure GetArticle(const group:string; index:integer); (* To get an article from a URL like news:msgid *) procedure GetArticleID(const msgid:string); procedure PostArticle; (* Methods more for a Newsreader *) procedure GetAllNewsgroups; procedure GetNewNewsgroups(since:TDateTime); procedure SetGroup(const group:string; var low,high,count: integer); procedure GetArticleNr(index:integer); procedure SetCurrentArticle(index:integer); procedure GetCurrentArticle; procedure GetNextArticle; procedure GetPreviousArticle;published property Hostname: string read f_hostname write f_hostname; property OnTrace;end;(*@///0000002301*)
{ Mail and News text components }(*@/// T_MailNews = class(TComponent) *)T_MailNews = class(TComponent)protected f_from, f_sender, f_subject: string; f_body: TStringlist; f_add_header: TStringlist; f_message: TStringlist; f_references: string; f_replyto: string; procedure SetBody(Value: TStringList); procedure SetHeader(Value: TStringList);public constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; VIRTUAL;published property Sender: string read f_sender write f_sender; property From: string read f_from write f_from; property Body: TStringList read f_body write SetBody; property Header: TStringList read f_add_header write SetHeader; property Subject:string read f_subject write f_subject; property References:string read f_references write f_references; property ReplyTo:string read f_replyto write f_replyto;end;(*@///0000001001*)(*@/// T_Mail = class(T_MailNews) // RFC 822 *)T_Mail = class(T_MailNews)protected f_smtp: T_SMTP; f_receipts: TStringlist; f_cc: TStringlist; f_bcc: TStringlist; f_disclose_receipts: boolean; procedure SetRecipients(Value: TStringList); procedure SetCC(Value: TStringList); procedure SetBCC(Value: TStringList);public constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; override;published property SMTP: T_SMTP read f_smtp write f_smtp; property Disclose_Receipts: boolean read f_disclose_receipts write f_disclose_receipts default false; property Recipients: TStringlist read f_receipts write SetRecipients; property CC: TStringlist read f_cc write SetCC; property BCC: TStringlist read f_bcc write SetBCC;end;(*@///0000000601*)(*@/// T_News = class(T_MailNews) // RFC 850 *)T_News = class(T_MailNews)protected f_nntp: T_NNTP; f_newsgroups: TStringlist; f_organization: string; procedure SetNewsgroups(Value: TStringList);public constructor Create(Aowner:TComponent); override; destructor Destroy; override; procedure action; override;published property NNTP: T_NNTP read f_nntp write f_nntp; property Newsgroups: TStringlist read f_newsgroups write SetNewsgroups; property Organization: string read f_organization write f_organization;end;(*@///0000000C14*)(*@/// T_Attachment = class(TObject) *)T_Attachment = class(TObject)protected f_kind: string; f_disposition: string; f_data: TStream; f_text: TStringList; f_encoding: T_Encoding; procedure SetText(value:TStringList); procedure SetData(value:TStream);public constructor Create; destructor Destroy; override; property Kind: string read f_kind write f_kind; property Disposition: string read f_disposition write f_disposition; property Encoding: T_Encoding read f_encoding write f_encoding; property Text:TStringlist read f_text write SetText; property Data:TStream read f_data write SetData;end;(*@///0000000D01*)(*@/// T_Mime = class(TComponent) // RFC 1521 *)T_Mime = class(TComponent)protected f_mail: T_MailNews; boundary: string; f_attachment: TList; function GetNumberOfAttachments: integer;public constructor Create(Aowner:TComponent); override; destructor Destroy; override; function AttachFile(const filename:string):integer; function AttachText(text: TStringList):integer; procedure RemoveAllAttachments; procedure action; procedure SetMail(mail: TStringlist); function GetAttachment(index: integer):T_Attachment; procedure RemoveAttachment(index: integer); property Attachment[index:integer]:T_Attachment read GetAttachment; property NumberOfAttachments: integer read GetNumberOfAttachments;published property Mail: T_MailNews read f_mail write f_mail;end;(*@///0000000A01*)
const uwm_socketevent = wm_user+$100; (* my magic message number *)
var lpr_count: integer; (* the current job number *)
procedure Register;(*@///0000003B03*)(*@/// implementation *)implementation