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. Client --------------> Ccnet Daemon --------------> Service Daemon UPDATE UPDATE Client --------------> Ccnet Daemon ------------> Service Daemon <------------- <------------ RESPONSE RESPONSE Remote Service Invoking ----------------------- remote Client -----------------------> Ccnet Daemon --------------> Remote Ccnet UPDATE UPDATE Client -----------------------> Ccnet Daemon --------------> Remote Ccnet <----------------------- <-------------- RESPONSE RESPONSE Note: if 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.