Protocol modules are dynamic link libraries with a
.PRT
extension and a UID2 of KUidProtocolModule
(0x1000004A
). They export one function as ordinal 1. This function
is called to create a single instance of a CProtocolFamilyBase
derived object.
Protocol families are used to group together various related
protocols, such as TCP, UDP and IP. A CProtocolFamilyBase
-derived
object is created for each protocol module when the socket server is started.
To achieve this, the socket server parses all .esk
files in the
System\Data
directory, and firstly looks up the
[sockman]
sections. Then, for each protocol named there, the
section of the same name is examined to find the filename of that protocol. The
dynamic link library given by that file is loaded, and the function at ordinal
1 is called to create the protocol family.
After the protocol family has been created in this way, the socket
server calls its ProtocolList()
functions. The socket server
caches the information gathered from calling ProtocolList()
and
unloads the protocol module when it is needed. Thus the socket server has an
up-to-date list of all protocols which can be run, without the memory overhead
of having them loaded at all times.
When a request comes in to create a socket of a particular type,
the socket server re-loads the protocol module and calls first
Install()
, and then Open()
and
NewProtocolL()
of the protocol family. The latter function
instantiates the new protocol.
The protocol family object should allocate memory to hold an array
of TServerProtocolDesc
structures. This function should then fill
them in and return the pointer and a count of the number of protocols
supported.
The socket server caches this information, so that it does not need to keep the protocol module loaded.
The protocol family should not attempt to use static data (which it can’t) or to free this memory later as the socket server will automatically free this storage.