Latest news:
Version 0.9.4 is released. Yet another bugfix.

Short description:

IOCP classes are set of classes, components and routines for rapid creation high scalable and performance TCP/UDP applications. Application created using IOCP classes can handle thousands simultaneous connections.

Library is written in Delphi5 and consists of the following classes:

TDnCachedFileLogger, TDnCallbackLogger, TDnSimpleExecutor, TDnThreadExecutor, TDnTimer, TDnTcpReactor, TDnTcpRequestor, TDnHttpRequestor, TDnTcpListener, TDnTcpFileWriter, TDnUdpReactor, TDnUdpRequestor, TDnWinsockManager

Component design of library lets you to prototype application in Delphi's form designer.

Library uses IO completion ports technology. There is most powerful technology in Win32 world for creation highly scalable and performance TCP/UDP applications. The following OSs supports this technology:

  • NT4 Server/Workstation
  • W2K professional/advanced server/DataCenter
  • XP home/professional

This library is licensed under MPL1.1.
Also It includes some files from Jedi project (Winsock2 header translation).

You may contact me at Dmytro_Bogovych_nospam@satorilight.com (just remove _nospam when writing letter).
Sorry for bad english.



You may download the version 0.9.4 here:
zip archive



FAQ

What is the difference between "IOCP classes" and other packages such as ICS, IP*Works, DXSock, Indy?

Why 'connection' is presented to developer as interface not object?

Can I use just classes derived from TObject? Not components?

I need to bind to each thread my own data. How can I do it?

How can I bind my own data to connection?

How can I bind connection's events to specific thread?

What's the purpose TDnSimpleExecutor?



What is the difference between "IOCP classes" and other packages such as ICS, IP*Works, DXSock, Indy?

IOCP classes provides for developer more flexible build blocks. It uses all potential of NT systems. However Win9X systems are not supported.


Why 'connection' is presented to developer as interface not object?

Library determines object lifetime using reference count technic. The interfaces let to implement it transparent to developer.



Can I use just classes derived from TObject? Not components?

Yes. You should to comment line {$DEFINE ROOTISCOMPONENT} in file DnConfig.inc



I need to bind to each thread my own data. How can I do it?

There is a TDnThreadContext object. It represents thread's context. You may use this class. Its instance is provided to developer in TDnThreadExecutor's events OnCreateContext and OnDestroyContext. Also instance of TDnThreadContext is provided in all asyncronous network events (reading/writing blocks and so on). You may inherit TDnThreadContext and create your own context class.

How can I bind my own data to connection?

Use IDnChannel's property CustomData. Or you may inherit from TDnTcpChannel in TDnTcpListener's event OnCreateChannel. But in asynchronous network events you receive interface implemented by this class. So you need to use IDnImplementation interface for getting pointer to instance of your class.



How can I bind connection's events to specific thread?

In TDnTcpListener.OnIncomingChannel event's handler you should to write:
ThreadExecutor.BindChannelToContext(Channel as IDnIOTrackerHolder, Context);
where ThreadExecutor is instance of TDnThreadExecutor, Channel is interface of connection, Context is thread's context.
When channel is closed you should to write:
ThreadExecutor.UnbindChannelFromContext(Channel as IDnIOTrackerHolder, Context);



What's the purpose TDnSimpleExecutor?

Is is written for debug purposes. It may be used in the case of unstable bug for verifying estimating about its thread's synchronization nature. Just replace TDnThreadExecutor with TDnSimpleExecutor and see the result.

SourceForge.net Logo

Free search engine submission and placement services!