载入中...
 
 
正版软件的序列号
[ 2008-1-17 14:32:00 | By: blogger ]
 
请输入日志访问密码:
 
 
 
IOCP
[ 2007-12-20 16:59:00 | By: blogger ]
 
 
IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字[socket]与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。
这里我要对上面的一些概念略作补充,在解释[完成]两字之前,我想先简单的提一下同步和异步这两个概念,逻辑上来讲做完一件事后再去做另一件事就是同步,而同时一起做两件或两件以上事的话就是异步了。你也可以拿单线程和多线程来作比喻。但是我们一定要将同步和堵塞,异步和非堵塞区分开来,所谓的堵塞函数诸如accept(…),当调用此函数后,此时线程将挂起,直到操作系统来通知它,”HEY兄弟,有人连进来了”,那个挂起的线程将继续进行工作,也就符合”生产者-消费者”模型。堵塞和同步看上去有两分相似,但却是完全不同的概念。
……
 
 
 
基于Delphi的Socket I/O模型全接触
[ 2007-12-20 16:56:00 | By: blogger ]
 
老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。

  这和Socket模型非常类似。下面我就以老陈接收信件为例讲解Socket I/O模型。

  一:select模型

  老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信,在这种情况下,“下楼检查信箱”然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。
……
 
 
 
DELPHI中完成端口(IOCP)的简单分析(4)
[ 2007-12-20 16:46:00 | By: blogger ]
 

在我以前写的文章中,一直说的是如何接收数据。但是对于如何发送数据却一点也没有提到。因为从代码量上来说接收的代码要比发送多很多。今天我就来写一下如何使用IOCP发送数据。

TNetControl.SendSpecifyData(const Socket: TSocket; Data: array of char;
  DataLen: Integer): Boolean;

const

  DATA_BUFSIZE = 1024;  //这里定义一个发送数据的缓存长度,只要和接收的一直就可以

var
  PerIoData: LPPER_IO_OPERATION_DATA ;
  SendBytes, RecvBytes: DWORD;
  Flags: DWORD ;
  LenStr:String;
  SendBuf:array [0..DATA_BUFSIZE] of char;
begin
  try
 //由于粘包的关系,所以在需要发送的数据前面加入4位这次发送数据的长度。(详见我的前一篇文章)


……
 
 
 
DELPHI中完成端口(IOCP)的简单分析(3)
[ 2007-12-20 16:41:00 | By: blogger ]
 

 
最近太忙,所以没有机会来写IOCP的后续文章。今天好不容易有了时间来写IOCP的粘包处理问题。
TCP数据粘包的产生原因在于TCP是一种流协议。在以太网中一个TCP的数据包长度是1500位。其中20位的IP包头,20位的TCP包头,其余的1460都是我们可以发送的数据。在数据发送的时候,我们发送的数据长度有可能比1460短,这样在TCP来说它还是以一个数据包来发送。从而降低了网络的利用率。所以TCP在发送数据包的时候,会将下一个数据包和这个数据包合在一起发送以增加网络利用率(虽然SOCKET 中可以强制关闭这种合并发送,但是我不建议使用)。这样以来,在我们接受到一个数据包以后,就会发现在这个数据包中含有其它的数据包,从而很难处理。
处理粘包现象有多种方法。我的方法是在每发送一个数据的前面加入这次发送的数据长度(4位)。以char的方式加入。这样以来我们的数据包结构就变成了:
数据包长度(4位)+实际数据。
在接收到数据包以后,我们首先得到数据包的长度,然后根据这个数据包长度来得到实际的数据。
……

 
 
 
DELPHI中完成端口(IOCP)的简单分析(2)
[ 2007-12-20 16:38:00 | By: blogger ]
 
今天我写一下关于DELPHI编写完成端口(IOCP)的工作者线程中的东西。希望各位能提出批评意见。
上次我写了关于常见IOCP的代码,对于IOCP来说,接受到客户端发送过来和自己发送出去的数据都是从工作者线程中得到。代码和解释如下:
ServerWorkerThread(CompletionPortID:Pointer):Integer;stdcall;
begin
   CompletionPort:=THANDLE(CompletionPortID);
   //得到创建线程是传递过来的IOCP
   while(TRUE) do
   begin
        //工作者线程会停止到GetQueuedCompletionStatus函数处,直到接受到数据为止
        if (GetQueuedCompletionStatus(CompletionPort, BytesTransferred,DWORD(PerHandleData), POverl
……
 
 
 
Delphi组件Indy 10中修正IdFTP不能续传问题
[ 2007-12-20 16:37:00 | By: blogger ]
 
提出问题:
在使用IdFTP组件下载文件时候,发现不能续传文件
    procedure Get(const ASource string; ADest: TIdStream; AResume: Boolean = false); overload;
    procedure Get(const ASourceFile, ADest string; const ACanOverwrite: boolean = false; AResume: Boolean = false); overload;

查看源代码(IdFTP.pas),发现:
procedure TIdFTP.Get(const ASourceFile, ADest string; const ACanOverwrite: boolean = Fa
……
 
 
 
DELPHI中完成端口(IOCP)的简单分析(1)
[ 2007-12-20 16:34:00 | By: blogger ]
 
(希望大家在转贴的时候注明出处,谢谢)
用DELPHI开发网络代码已经有一段时间了!
我发现在网上用VC来实现完成端口(IOCP)的代码很多,但是使用DELPHI来实现的就比较少了。对IOCP讲的清楚的就更少了。在这里我把自己编写DELPHI下的IOCP写出来,希望对刚学完成端口的朋友有个帮助。
首先我们来了解一些在使用IOCP的时候需要使用的一些结构!
(1):单IO数据结构
  LPVOID = Pointer;
  LPPER_IO_OPERATION_DATA = ^ PER_IO_OPERATION_DATA ;
  PER_IO_OPERATION_DATA = packed record
    Overlapped: OVERLAPPED;
    DataBuf: TWSABUF;
    Buffer: array [0..1024] of CHAR;
  
……
 
 
 
完成端口(IOCP - I/O Completion Port)及其在 Delphi 下的实现
[ 2007-12-20 16:32:00 | By: blogger ]
 

完成端口(IOCP - I/O Completion Port)及其在 Delphi 下的实现

对于开发一个不考虑跨平台,只在 Windows Server 环境下运行的高性能服务器来说,IOCP无疑是一个最优的解决方案。最近一个项目要用到 IOCP ,特地找了些资料。网上的资料很多,但很多都是以基础性的介绍为主,代码也是些经典书籍上的标准代码。这些代码对理解IOCP无疑是很重要的,但对于高性能服务器开发来说,细节的实现则似乎更加重要。根据自己最近做的一个项目,有几点体会,特记录下来,以备后查。


……
 
 
 
Delphi网络单元库
[ 2007-12-20 16:15:00 | By: blogger ]
 
Delphi网络单元库
unit net;

interface
  uses
      sysutils
     ,windows
     ,dialogs
     ,winsock
     ,classes
     ,comobj
     ,wininet;

  //得到本机的局域网ip地址
   getlocalip(var localip:string): boolean;
  //通过ip返回机器名
   getnamebyipaddr(ipaddr: string; var macname: string): bool
……
 
 
首页 上一页 下一页 尾页 页次:1/3页  10篇日志/页 转到:

载入中...
时 间 记 忆
载入中...
最 新 评 论
载入中...
专 题 分 类
载入中...
最 新 日 志
载入中...
最 新 留 言
载入中...
搜 索
用 户 登 录
载入中...
友 情 连 接
博 客 信 息
载入中...


Powered by Oblog.