mirror of https://github.com/deavminet/dnetd.git
Freeze
This commit is contained in:
parent
1071d11345
commit
cc4de82818
|
@ -5,5 +5,13 @@
|
||||||
"network" : "aBasedIRCNetwork",
|
"network" : "aBasedIRCNetwork",
|
||||||
"name" : "MyBrandSpankingNewIRCServer",
|
"name" : "MyBrandSpankingNewIRCServer",
|
||||||
"motd" : "Welcome to my generic dnet chat server!"
|
"motd" : "Welcome to my generic dnet chat server!"
|
||||||
|
},
|
||||||
|
|
||||||
|
"links" : {
|
||||||
|
"server1" : {
|
||||||
|
"name" : "server1",
|
||||||
|
"address" : "",
|
||||||
|
"port" : ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
Meyer link protocol
|
||||||
|
===================
|
||||||
|
|
||||||
|
This document describes the Meyer linking protocol which is used to maintain server links in the dnet network and deliver data across the links.
|
||||||
|
|
||||||
|
## Protocol
|
||||||
|
|
||||||
|
Every server maintains a list of connections (server, clients and unspec), this is the `DConnection[]` array. What we are concerned with here is the subset of that array which has `ConnectionType.SERVER` (so all servers).
|
||||||
|
|
||||||
|
We also maintain a list of all servers that we know of via links, this is called `sl` and normally written in the notation of `sl=[]`. Some of these elements will be servers in `DConnection[]` (direct) however not all will be (indirect).
|
||||||
|
|
||||||
|
### Link request
|
||||||
|
|
||||||
|
A link request is when Server B makes a request to Server A to link up (`Server B -> Server A`) then the following happens.
|
||||||
|
|
||||||
|
Server A checks its `sl=[]` and checks if the announced server name by Server B is in it, if so it closes the request as they must be linked already directly or indirectly.
|
||||||
|
|
||||||
|
However, if not then it will add `B` to its `sl=[]`, so now it is `sl=[B]`. Another thing to note is when Server B makes the request (regardless of if it will go through or not), it will
|
||||||
|
|
||||||
|
|
||||||
|
WHen a server wants to link with another it sends a lin request containing:
|
||||||
|
|
||||||
|
1. it's server name
|
||||||
|
2. a list of the links it has (direct and indirect)
|
||||||
|
|
||||||
|
The receiving server checks first of all if
|
|
@ -7,6 +7,12 @@ import std.exception;
|
||||||
|
|
||||||
void main(string[] args)
|
void main(string[] args)
|
||||||
{
|
{
|
||||||
|
int i = -1;
|
||||||
|
long k = i;
|
||||||
|
writeln(cast(ulong)k);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Configuration file */
|
/* Configuration file */
|
||||||
string configFilename;
|
string configFilename;
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,9 @@ public class DConnection : Thread
|
||||||
{
|
{
|
||||||
/* TODO: Implement me later */
|
/* TODO: Implement me later */
|
||||||
|
|
||||||
|
/* Check if this connection is a DLink'd one */
|
||||||
|
//server.getMeyer().get
|
||||||
|
|
||||||
|
|
||||||
/* Set the type of this connection to `server` */
|
/* Set the type of this connection to `server` */
|
||||||
connType = ConnectionType.SERVER;
|
connType = ConnectionType.SERVER;
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
module dnetd.dlink;
|
||||||
|
|
||||||
|
import dnetd.dconnection;
|
||||||
|
import core.sync.mutex : Mutex;
|
||||||
|
import std.stdio;
|
||||||
|
import std.conv;
|
||||||
|
import dnetd.dserver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DLink
|
||||||
|
*
|
||||||
|
* Couples a DConneciton (direct peer)
|
||||||
|
* with information about what this link
|
||||||
|
* knows and can tell us
|
||||||
|
*/
|
||||||
|
public final class DLink
|
||||||
|
{
|
||||||
|
/* The directly attached peer */
|
||||||
|
private DConnection directPeer;
|
||||||
|
|
||||||
|
/* Servers (by name) this server is aware of */
|
||||||
|
private string[] knowledgeList;
|
||||||
|
|
||||||
|
this(DConnection directPeer)
|
||||||
|
{
|
||||||
|
this.directPeer = directPeer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call this to update list */
|
||||||
|
public void updateKB()
|
||||||
|
{
|
||||||
|
/* TODO: Ask DConneciton here for the servers he knows */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class DMeyer
|
||||||
|
{
|
||||||
|
/* List of links (direct peers + additional information) */
|
||||||
|
private DLink[] links;
|
||||||
|
private Mutex linksMutex;
|
||||||
|
|
||||||
|
private DServer server;
|
||||||
|
|
||||||
|
this(DServer server)
|
||||||
|
{
|
||||||
|
this.server = server;
|
||||||
|
linksMutex = new Mutex();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attach a direct peer */
|
||||||
|
public void attachDirectPeer(DConnection peer)
|
||||||
|
{
|
||||||
|
/* TODO: Add to `directPeers` */
|
||||||
|
linksMutex.lock();
|
||||||
|
|
||||||
|
links ~= new DLink(peer);
|
||||||
|
writeln("Attached direct peer: "~to!(string)(peer));
|
||||||
|
|
||||||
|
linksMutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get a list of all servers we know of */
|
||||||
|
|
||||||
|
|
||||||
|
public DLink getLink(DConnection peer)
|
||||||
|
{
|
||||||
|
DLink link;
|
||||||
|
|
||||||
|
linksMutex.lock();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
linksMutex.unlock();
|
||||||
|
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ import core.sync.mutex : Mutex;
|
||||||
import std.stdio;
|
import std.stdio;
|
||||||
import std.conv : to;
|
import std.conv : to;
|
||||||
import dnetd.dconfig;
|
import dnetd.dconfig;
|
||||||
|
import dnetd.dlink;
|
||||||
|
|
||||||
public class DServer : Thread
|
public class DServer : Thread
|
||||||
{
|
{
|
||||||
|
@ -43,6 +44,11 @@ public class DServer : Thread
|
||||||
*/
|
*/
|
||||||
private DChannel[] channels;
|
private DChannel[] channels;
|
||||||
private Mutex channelLock;
|
private Mutex channelLock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Meyer linking subsystem
|
||||||
|
*/
|
||||||
|
private DMeyer meyerSS;
|
||||||
|
|
||||||
/* TODO: Implement new constructor */
|
/* TODO: Implement new constructor */
|
||||||
this(DConfig config)
|
this(DConfig config)
|
||||||
|
@ -111,8 +117,16 @@ public class DServer : Thread
|
||||||
channelLock = new Mutex();
|
channelLock = new Mutex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DMeyer getMeyer()
|
||||||
|
{
|
||||||
|
return meyerSS;
|
||||||
|
}
|
||||||
|
|
||||||
private void startServer()
|
private void startServer()
|
||||||
{
|
{
|
||||||
|
/* Initialize the Meyer linking sub-system */
|
||||||
|
meyerSS = new DMeyer(this);
|
||||||
|
|
||||||
/* Start the connection dequeue thread */
|
/* Start the connection dequeue thread */
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue