mirror of
https://github.com/haiwen/ccnet-server.git
synced 2025-04-27 10:20:49 +00:00
127 lines
3.9 KiB
Plaintext
127 lines
3.9 KiB
Plaintext
|
|
Terminology
|
|
===========
|
|
|
|
* Peer
|
|
* Ccnet daemon
|
|
* Client
|
|
* Service daemon: for example seafile daemon.
|
|
|
|
|
|
Peer Transfer Layer
|
|
===================
|
|
|
|
Communication between peer is packet oriented.
|
|
|
|
The packet structure is defined in `lib/packet.h` as
|
|
|
|
struct ccnet_header {
|
|
uint8_t version;
|
|
uint8_t type;
|
|
uint16_t length; /* length of payload */
|
|
uint32_t id; /* for identify a service session id */
|
|
};
|
|
|
|
struct ccnet_packet {
|
|
struct ccnet_header header;
|
|
char data[0];
|
|
};
|
|
|
|
So the max length of payload is 65535.
|
|
|
|
|
|
Service Invocation
|
|
==================
|
|
|
|
Ccnet provide a service invocation layer upon transfer layer.
|
|
|
|
Local Service Invoking
|
|
----------------------
|
|
|
|
A local service is provided either by ccnet daemon or a service
|
|
daemon. To invoke a local service, client first sends a REQUEST
|
|
packet containing the service name and arguments to ccnet
|
|
daemon. Ccnet daemon will find the daemon who provide the service and
|
|
start the service. This starts a `service session`. A service session
|
|
is identified by a unique id. Later communication for this session
|
|
using REQUEST and UPDATE packets. These packets constains the unique
|
|
id in their header for the partners to identify the session.
|
|
|
|
<service-name> <service-name>
|
|
Client --------------> Ccnet Daemon --------------> Service Daemon
|
|
|
|
UPDATE UPDATE
|
|
Client --------------> Ccnet Daemon ------------> Service Daemon
|
|
<------------- <------------
|
|
RESPONSE RESPONSE
|
|
|
|
|
|
Remote Service Invoking
|
|
-----------------------
|
|
|
|
|
|
remote <peer-id> <service-name> <service-name>
|
|
Client -----------------------> Ccnet Daemon --------------> Remote Ccnet
|
|
|
|
UPDATE UPDATE
|
|
Client -----------------------> Ccnet Daemon --------------> Remote Ccnet
|
|
<----------------------- <--------------
|
|
RESPONSE RESPONSE
|
|
|
|
Note: if <peer-id> is self, remote service invoking will be
|
|
automatically turned to local service invoking.
|
|
|
|
|
|
Service Registration
|
|
--------------------
|
|
|
|
The daemons implements a service by a subclass of `CcnetProcessor` and
|
|
registers it to ccnet daemon by calling `ccnet_register_service()`:
|
|
|
|
CcnetClient *client;
|
|
ccnet_register_service (client, "seafile-rpcserver",
|
|
CCNET_TYPE_RPCSERVER_PROC);
|
|
|
|
This is used by the seafile daemon to register service
|
|
"seafile-rpcserver" to ccnet daemon.
|
|
|
|
Inside the ccnet daemon, a service is registered simply by calling
|
|
|
|
void
|
|
ccnet_proc_factory_register_processor (CcnetProcFactory *factory,
|
|
const char *proc_name,
|
|
GType type);
|
|
|
|
|
|
Processor Management
|
|
====================
|
|
|
|
Local Service Invoking
|
|
----------------------
|
|
|
|
To support local service invoking, a service proxy processor and a
|
|
service stub processor will be started when necessary. The runtime
|
|
configuration is as following:
|
|
|
|
Local Client Ccnet Daemon Service Daemon
|
|
----------------------------------
|
|
Client Processor ---> | Service Proxy --> Service Stub | --> Daemon Processor
|
|
----------------------------------
|
|
|
|
Remote Service Invoking
|
|
-----------------------
|
|
|
|
The runtime configuration is as following:
|
|
|
|
Local Client Ccnet Daemon Remote Ccnet Daemon
|
|
----------------------------------
|
|
Client Processor ---> | Service Proxy --> Service Stub | --> Daemon Processor
|
|
----------------------------------
|
|
|
|
|
|
Notes when using processor
|
|
--------------------------
|
|
|
|
* A class of processor may provide different services, we use 'processor->name'
|
|
to remember which service an instance of a processor class provided.
|