转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
TCP/IP (四)         ★★★★

TCP/IP (四)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1488 更新时间:2009/4/23 18:43:56

(*@\\\0000000501*)
(*@/// destructor t_fingerd.Destroy; *)
destructor t_fingerd.Destroy;
begin
  f_answer.Free;
  inherited destroy;
  end;
(*@\\\0000000301*)
(*@/// procedure t_fingerd.do_action; *)
procedure t_fingerd.do_action;
var
  i: integer;
  temp_socket: TSocket;
  finger_info:TFingerInfo;
  sockinfo: TSockAddr;
  s: string;
begin
  temp_socket:=f_socket;
  self.f_socket:=accept_socket_in(f_socket,sockinfo);
  f_eof:=false;
  finger_info.address:=longint(sockinfo.Sin_addr);
  s:=self.read_line(f_socket);
  finger_info.request:=s;
  finger_info.hostname:='''''''';   (* NYI !!! *)
  if assigned(f_fingerrequest) then
    f_fingerrequest(self,finger_info);
  for i:=0 to f_answer.count-1 do begin
    self.write_s(f_socket,f_answer.strings[i]+#13#10);
    end;
  close_socket_linger(f_socket);
  f_socket:=temp_socket;
  end;
(*@\\\000000131B*)
(*@/// procedure t_fingerd.SetAnswer(Value: TStringList); *)
procedure t_fingerd.SetAnswer(Value: TStringList);
begin
  if value=NIL then
    f_answer.clear
  else
    f_answer.assign(value);
  end;
(*@\\\0000000603*)
(*@/// procedure t_fingerd.WndProc(var Msg : TMessage); *)
procedure t_fingerd.WndProc(var Msg : TMessage);
begin
  if msg.msg<>uwm_socketevent then
    inherited wndproc(msg)
  else begin
    if msg.lparamhi=socket_error then
    else begin
      case msg.lparamlo of
        fd_accept: begin
          do_action;
          end;
        end;
      end;
    end;
  end;
(*@\\\0000000E09*)
(*@/// procedure t_fingerd.action; *)
procedure t_fingerd.action;
begin
  open_socket_in(f_socket,f_Socket_number,my_ip_address);
  if f_socket=INVALID_SOCKET then
    raise ESocketError.Create(WSAGetLastError);
  winsock.WSAAsyncSelect(f_socket,f_handle,uwm_socketevent,fd_accept);
  end;
(*@\\\000000010B*)
(*@\\\000000051C*)

{ HTTP and FTP - the file transfer protocols }
(*@/// class t_http(t_tcpip) *)
(*@/// constructor t_http.Create(Aowner:TComponent); *)
constructor t_http.Create(Aowner:TComponent);
begin
  inherited create(AOwner);
  f_content_post:=''''application/x-www-form-urlencoded'''';
  f_do_author:=TStringlist.Create;
  end;
(*@\\\0000000503*)
(*@/// destructor t_http.Destroy; *)
destructor t_http.Destroy;
begin
  f_do_author.free;
  inherited destroy;
  end;
(*@\\\*)

(*@/// procedure t_http.sendrequest(const method,version: string); *)
procedure t_http.sendrequest(const method,version: string);
begin
  SendCommand(method+'''' ''''+f_path+'''' HTTP/''''+version);
  if f_sender<>'''''''' then
    SendCommand(''''From: ''''+f_sender);
  if f_reference<>'''''''' then
    SendCommand(''''Referer: ''''+f_reference);
  if f_agent<>'''''''' then
    SendCommand(''''User-Agent: ''''+f_agent);
  if f_nocache then
    SendCommand(''''Pragma: no-cache'''');
  if method=''''POST'''' then begin
    SendCommand(''''Content-Length: ''''+inttostr(stream.size));
    if f_content_post<>'''''''' then
      SendCommand(''''Content-Type: ''''+f_content_post);
    end;
  if f_author<>'''''''' then begin
    self.write_s(f_socket,''''Authorization: ''''+f_author+#13#10);
    if assigned(f_tracer) then
      f_tracer(''''Authorization: *****'''',tt_proto_sent);
    end;
  self.write_s(f_socket,#13#10);                          (* finalize the request *)
  end;
(*@\\\0000000301*)
(*@/// procedure t_http.getanswer; *)
procedure t_http.getanswer;
var
  s: string;
  proto,user,pass,port: string;
  field,data: string;
begin
  f_do_author.clear;
  f_type:='''''''';
  f_size:=0;
  repeat
    s:=self.read_line(f_socket);
    if s<>'''''''' then
      if assigned(f_tracer) then
        f_tracer(s,tt_proto_get);
    if false then
(*@///     else if left(s,8)=''''HTTP/1.0'''' then    http-status-reply *)
else if copy(s,1,8)=''''HTTP/1.0'''' then begin
  f_status_nr:=strtoint(copy(s,10,3));
  f_status_txt:=copy(s,14,length(s));
  if f_status_nr>=400 then EXIT;   (* HTTP error returned *)
  end
(*@\\\*)
(*@///     else if pos('''':'''',s)>0         then    parse the response string *)
else if pos('''':'''',s)>0 then begin
  field:=lowercase(copy(s,1,pos('''':'''',s)-1));
  data:=copy(s,pos('''':'''',s)+2,length(s));
  if false then
{   else if field=''''date'''' then }
{   else if field=''''mime-version'''' then }
{   else if field=''''pragma'''' then }
{   else if field=''''allow'''' then }
(*@///   else if field=''''location'''' then   change the uri !!! *)
else if field=''''location'''' then begin
  if proxy<>'''''''' then
    f_path:=data            (* it goes via a proxy, so just change the uri *)
  else begin
    parse_url(data,proto,user,pass,f_hostname,port,f_path);
    if port<>'''''''' then  f_Socket_number:=strtoint(port);
    end;
  end
(*@\\\0000000601*)
{   else if field=''''server'''' then }
{   else if field=''''content-encoding'''' then }
(*@///   else if field=''''content-length'''' then *)
else if field=''''content-length'''' then
  f_size:=strtoint(data)
(*@\\\*)
(*@///   else if field=''''content-type'''' then *)
else if field=''''content-type'''' then
  f_type:=data
(*@\\\*)
(*@///   else if field=''''www-authenticate'''' then *)
else if field=''''www-authenticate'''' then
  f_do_author.add(data)
(*@\\\000000020E*)
{   else if field=''''expires'''' then }
{   else if field=''''last-modified'''' then }
  end
(*@\\\0000000901*)
(*@///     else                                 some very strange response, ignore it *)
else;
(*@\\\*)
  until s='''''''';
  if f_status_nr>=400 then
    raise EProtocolError.Create(''''HTTP'''',f_status_txt,f_status_nr);
  end;
(*@\\\0000001101*)

(*@/// procedure t_http.action; *)
procedure t_http.action;
var
  proto,user,pass,host,port,path: string;
begin
(*@///   parse url and proxy to f_hostname, f_path and f_socket_number *)
if f_proxy<>'''''''' then begin
  parse_url(f_url,proto,user,pass,host,port,path);
  f_path:=f_url;
  if proto='''''''' then
    f_path:=''''http://''''+f_path;
  parse_url(f_proxy,proto,user,pass,host,port,path);
  if port='''''''' then port:=''''8080'''';
  end
else begin
  parse_url(f_url,proto,user,pass,host,port,f_path);
  if port='''''''' then port:=''''80'''';
  end;
if proto='''''''' then  proto:=''''http'''';
if f_path='''''''' then f_path:=''''/'''';

f_hostname:=host;
f_Socket_number:=strtoint(port);
(*@\\\0000000601*)
  gethead;   (* to process an eventually Location: answer *)
  getbody;
  end;
(*@\\\0000000501*)
(*@/// procedure t_http.GetHead; *)
procedure t_http.GetHead;
begin
  login;
  sendrequest(''''HEAD'''',''''1.0'''');
  getanswer;
  logout;
  end;
(*@\\\0000000701*)
(*@/// procedure t_http.GetBody; *)
procedure t_http.GetBody;
var
  p: pointer;
  ok,ok2:integer;
begin
  login;
  sendrequest(''''GET'''',''''1.0'''');
  getanswer;
(*@///   read the data *)
TMemorystream(f_stream).clear;
while not eof(f_socket) do begin
  read_var(f_socket,f_buffer^,buf_size,ok);
  p:=f_buffer;
  while ok>0 do begin   (* just to be sure everything goes into the stream *)
    ok2:=f_stream.write(p^,ok);
    dec(ok,ok2);
    p:=pointer(longint(p)+ok2);
    end;
  end;
f_stream.seek(0,0);  (* set the stream back to start *)
(*@\\\*)
  logout;
  end;
(*@\\\0000000901*)
(*@/// procedure t_http.Post; *)
procedure t_http.Post;
var
  p: pointer;
 

[1] [2]  下一页


[Delphi程序]Delphi 程序员代码编写标准指南 (四)  [Delphi程序]TCP/IP (五)
[Delphi程序]TCP/IP (三)  [Delphi程序]TCP/IP 使网络连接驱向简单化(二)
[Delphi程序]TCP/IP 使网络连接驱向简单化  [VB.NET程序]用VB5 Winsock控件创建TCP\IP客户机 服务器程序
[MySql]Linux TCP/IP 协议栈源码分析(一)  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台