public void Close(SimulationSocket closeSS) { if (closeSS.isConnected) { if (snd[closeSS.localPortNumber] == null) { throw new InvalidOperationException("not_used"); } if (snd[closeSS.localPortNumber] != closeSS) { throw new InvalidOperationException("not_equal"); } snd[closeSS.localPortNumber] = null; } else if (closeSS.isListened) { if (snd[closeSS.localPortNumber] == null) { throw new InvalidOperationException("not_used"); } if (snd[closeSS.localPortNumber] != closeSS) { throw new InvalidOperationException("not_equal"); } snd[closeSS.localPortNumber] = null; } else { throw new InvalidOperationException("not_connected_and_listened"); } }
public SimulationNetwork(ushort _maxPort, ushort _minListenerPortNumber) { if (_minListenerPortNumber > _maxPort) throw new ArgumentException("min_listener_port_number"); maxPort = _maxPort; minListenerPortNumber = _minListenerPortNumber; snd = new SimulationSocket[maxPort]; }
public void OnConnected(SimulationSocket ss) { if (!isListened) { throw new InvalidOperationException("not_listened"); } lock (acceptQueueLock) acceptQueue.Enqueue(ss); acceptAre.Set(); }
public SimulationNetwork(ushort _maxPort, ushort _minListenerPortNumber) { if (_minListenerPortNumber > _maxPort) { throw new ArgumentException("min_listener_port_number"); } maxPort = _maxPort; minListenerPortNumber = _minListenerPortNumber; snd = new SimulationSocket[maxPort]; }
public ConnectReturn Connect(ushort portNumber, SimulationSocket connectSS) { if (portNumber >= maxPort) throw new ArgumentException("too_large_port_number"); if (portNumber < minListenerPortNumber) throw new ArgumentException("too_small_port_number"); if (snd[portNumber] == null) throw new InvalidOperationException("not_yet_used"); if (!snd[portNumber].isListened) throw new InvalidOperationException("not_listened"); Func<ushort> _FindUsablePort = () => { ushort? point = null; lock (pointerLock) { for (ushort i = pointer; i < minListenerPortNumber; i++) if (snd[i] == null) { point = i; break; } if (point == null) for (ushort i = 0; i < pointer; i++) if (snd[i] == null) { point = i; break; } if (point == null) throw new InvalidOperationException("no_usable_port"); pointer = (ushort)(point.Value + 1); } return point.Value; }; ushort connectPortNumber = _FindUsablePort(); ushort connectedPortNumber = _FindUsablePort(); SimulationSocket connectedSS = new SimulationSocket(this, connectedPortNumber, connectPortNumber); snd[connectPortNumber] = connectSS; snd[connectedPortNumber] = connectedSS; snd[portNumber].OnConnected(connectedSS); return new ConnectReturn(connectPortNumber, connectedPortNumber); }
public void Listen(ushort portNumber, SimulationSocket listenSS) { if (portNumber >= maxPort) { throw new ArgumentException("too_large_port_number"); } if (portNumber < minListenerPortNumber) { throw new ArgumentException("too_small_port_number"); } if (snd[portNumber] != null) { throw new InvalidOperationException("already_used"); } snd[portNumber] = listenSS; }
public void Start() { stopwatch.Start(); //int[] nodes = SelectNodes1(0); int[] nodes = SelectNodes2(0, null); for (int j = 0; j < nodes.Length; j++) { SimulationSocket ss = new SimulationSocket(sn); Thread.Sleep(connectWait); ss.Connect(IPAddress.Loopback, (ushort)(startPortNumber + nodes[j])); connections.Add(ss.localPortNumber, (ushort)(startPortNumber + nodes[j])); connections.Add(ss.remotePortNumber, 9000); ss.Write(nodeInfos[0].ToBinary()); ss.Write(new byte[1024]); ss.Close(); } }
public void Write(SimulationSocket writeSS, byte[] data) { if (writeSS.isListened) { throw new InvalidOperationException("listened"); } if (!writeSS.isConnected) { throw new InvalidOperationException("not_connected"); } if (snd[writeSS.localPortNumber] == null || snd[writeSS.remotePortNumber] == null) { throw new InvalidOperationException("not_used"); } if (snd[writeSS.localPortNumber] != writeSS) { throw new InvalidOperationException("not_equal"); } snd[writeSS.remotePortNumber].OnReceived(data); Communicated(this, new Tuple <ushort, ushort>(writeSS.localPortNumber, writeSS.remotePortNumber)); }
public DiffuseSimulation() { nodeInfos = new NodeInformation[numberOfNodes]; for (int i = 0; i < numberOfNodes; i++) nodeInfos[i] = new NodeInformation(IPAddress.Loopback, (ushort)(startPortNumber + i), Network.localtest, string.Empty); for (int i = 0; i < numberOfNodes; i++) portNumberToIndex.Add(nodeInfos[i].portNumber, i); sn = new SimulationNetwork(); sss = new SimulationSocket[numberOfNodes]; cremlias = new Cremlia[numberOfNodes]; randomNumss = numberOfNodes.PipeForever((non) => non.RandomNums()).Where((ns) => ns.Select((n, i) => new { n, i }).All((ni) => ni.n != ni.i)).Take(numberOfDiffuseNodes).ToArray(); int receiveCounter = 0; for (int i = 0; i < numberOfNodes; i++) { sss[i] = new SimulationSocket(sn); sss[i].Bind(new IPEndPoint(IPAddress.Any, nodeInfos[i].portNumber)); sss[i].Listen(100); cremlias[i] = new Cremlia(new CremliaIdFactorySha256(), new CremliaDatabaseIo(), new CremliaNetworkIoSimulation(sss[i]), new CremliaNodeInfomationSha256(nodeInfos[i])); int[] randomNums = numberOfNodes.RandomNums(); for (int j = 0; j < numberOfNodes; j++) if (randomNums[j] != i) cremlias[i].UpdateNodeStateWhenJoin(new CremliaNodeInfomationSha256(nodeInfos[randomNums[j]])); int index = i; this.StartTask(string.Empty, string.Empty, () => { object l = new object(); int counter = 0; while (true) { SimulationSocket ss = sss[index].Accept() as SimulationSocket; bool flag = false; lock (l) if (counter++ == 0) flag = true; this.StartTask(string.Empty, string.Empty, () => { NodeInformation ni = SHAREDDATA.FromBinary<NodeInformation>(ss.Read()); byte[] data = ss.Read(); ss.Close(); Thread.Sleep(connectWait); if (flag && index != 0) { Received(this, ++receiveCounter); this.ConsoleWriteLine(string.Join(",", receiveCounter.ToString(), stopwatch.ElapsedMilliseconds.ToString())); if (receiveCounter == numberOfNodes) stopwatch.Stop(); //int[] nodes = SelectNodes1(index); int[] nodes = SelectNodes2(index, ni); for (int j = 0; j < nodes.Length; j++) { SimulationSocket ss2 = new SimulationSocket(sn); Thread.Sleep(verifyWait); ss2.Connect(IPAddress.Loopback, (ushort)(startPortNumber + nodes[j])); connections.Add(ss2.localPortNumber, (ushort)(startPortNumber + nodes[j])); connections.Add(ss2.remotePortNumber, nodeInfos[index].portNumber); ss2.Write(nodeInfos[index].ToBinary()); ss2.Write(new byte[1024]); ss2.Close(); } } }); } }); } }
public void OnConnected(SimulationSocket ss) { if (!isListened) throw new InvalidOperationException("not_listened"); lock (acceptQueueLock) acceptQueue.Enqueue(ss); acceptAre.Set(); }
public void Write(SimulationSocket writeSS, byte[] data) { if (writeSS.isListened) throw new InvalidOperationException("listened"); if (!writeSS.isConnected) throw new InvalidOperationException("not_connected"); if (snd[writeSS.localPortNumber] == null || snd[writeSS.remotePortNumber] == null) throw new InvalidOperationException("not_used"); if (snd[writeSS.localPortNumber] != writeSS) throw new InvalidOperationException("not_equal"); snd[writeSS.remotePortNumber].OnReceived(data); Communicated(this, new Tuple<ushort, ushort>(writeSS.localPortNumber, writeSS.remotePortNumber)); }
public CremliaNetworkIoSessionSimulation(ICremliaNodeInfomation _nodeInfo, SimulationSocket _ss) { nodeInfo = _nodeInfo; ss = _ss; }
public CremliaNetworkIoSimulation(SimulationSocket _ss) { ss = _ss; }
public DiffuseSimulation() { nodeInfos = new NodeInformation[numberOfNodes]; for (int i = 0; i < numberOfNodes; i++) { nodeInfos[i] = new NodeInformation(IPAddress.Loopback, (ushort)(startPortNumber + i), Network.localtest, string.Empty); } for (int i = 0; i < numberOfNodes; i++) { portNumberToIndex.Add(nodeInfos[i].portNumber, i); } sn = new SimulationNetwork(); sss = new SimulationSocket[numberOfNodes]; cremlias = new Cremlia[numberOfNodes]; randomNumss = numberOfNodes.PipeForever((non) => non.RandomNums()).Where((ns) => ns.Select((n, i) => new { n, i }).All((ni) => ni.n != ni.i)).Take(numberOfDiffuseNodes).ToArray(); int receiveCounter = 0; for (int i = 0; i < numberOfNodes; i++) { sss[i] = new SimulationSocket(sn); sss[i].Bind(new IPEndPoint(IPAddress.Any, nodeInfos[i].portNumber)); sss[i].Listen(100); cremlias[i] = new Cremlia(new CremliaIdFactorySha256(), new CremliaDatabaseIo(), new CremliaNetworkIoSimulation(sss[i]), new CremliaNodeInfomationSha256(nodeInfos[i])); int[] randomNums = numberOfNodes.RandomNums(); for (int j = 0; j < numberOfNodes; j++) { if (randomNums[j] != i) { cremlias[i].UpdateNodeStateWhenJoin(new CremliaNodeInfomationSha256(nodeInfos[randomNums[j]])); } } int index = i; this.StartTask(string.Empty, string.Empty, () => { object l = new object(); int counter = 0; while (true) { SimulationSocket ss = sss[index].Accept() as SimulationSocket; bool flag = false; lock (l) if (counter++ == 0) { flag = true; } this.StartTask(string.Empty, string.Empty, () => { NodeInformation ni = SHAREDDATA.FromBinary <NodeInformation>(ss.Read()); byte[] data = ss.Read(); ss.Close(); Thread.Sleep(connectWait); if (flag && index != 0) { Received(this, ++receiveCounter); this.ConsoleWriteLine(string.Join(",", receiveCounter.ToString(), stopwatch.ElapsedMilliseconds.ToString())); if (receiveCounter == numberOfNodes) { stopwatch.Stop(); } //int[] nodes = SelectNodes1(index); int[] nodes = SelectNodes2(index, ni); for (int j = 0; j < nodes.Length; j++) { SimulationSocket ss2 = new SimulationSocket(sn); Thread.Sleep(verifyWait); ss2.Connect(IPAddress.Loopback, (ushort)(startPortNumber + nodes[j])); connections.Add(ss2.localPortNumber, (ushort)(startPortNumber + nodes[j])); connections.Add(ss2.remotePortNumber, nodeInfos[index].portNumber); ss2.Write(nodeInfos[index].ToBinary()); ss2.Write(new byte[1024]); ss2.Close(); } } }); } }); } }
public ConnectReturn Connect(ushort portNumber, SimulationSocket connectSS) { if (portNumber >= maxPort) { throw new ArgumentException("too_large_port_number"); } if (portNumber < minListenerPortNumber) { throw new ArgumentException("too_small_port_number"); } if (snd[portNumber] == null) { throw new InvalidOperationException("not_yet_used"); } if (!snd[portNumber].isListened) { throw new InvalidOperationException("not_listened"); } Func <ushort> _FindUsablePort = () => { ushort?point = null; lock (pointerLock) { for (ushort i = pointer; i < minListenerPortNumber; i++) { if (snd[i] == null) { point = i; break; } } if (point == null) { for (ushort i = 0; i < pointer; i++) { if (snd[i] == null) { point = i; break; } } } if (point == null) { throw new InvalidOperationException("no_usable_port"); } pointer = (ushort)(point.Value + 1); } return(point.Value); }; ushort connectPortNumber = _FindUsablePort(); ushort connectedPortNumber = _FindUsablePort(); SimulationSocket connectedSS = new SimulationSocket(this, connectedPortNumber, connectPortNumber); snd[connectPortNumber] = connectSS; snd[connectedPortNumber] = connectedSS; snd[portNumber].OnConnected(connectedSS); return(new ConnectReturn(connectPortNumber, connectedPortNumber)); }
public void Listen(ushort portNumber, SimulationSocket listenSS) { if (portNumber >= maxPort) throw new ArgumentException("too_large_port_number"); if (portNumber < minListenerPortNumber) throw new ArgumentException("too_small_port_number"); if (snd[portNumber] != null) throw new InvalidOperationException("already_used"); snd[portNumber] = listenSS; }
public void Close(SimulationSocket closeSS) { if (closeSS.isConnected) { if (snd[closeSS.localPortNumber] == null) throw new InvalidOperationException("not_used"); if (snd[closeSS.localPortNumber] != closeSS) throw new InvalidOperationException("not_equal"); snd[closeSS.localPortNumber] = null; } else if (closeSS.isListened) { if (snd[closeSS.localPortNumber] == null) throw new InvalidOperationException("not_used"); if (snd[closeSS.localPortNumber] != closeSS) throw new InvalidOperationException("not_equal"); snd[closeSS.localPortNumber] = null; } else throw new InvalidOperationException("not_connected_and_listened"); }