public override Task <AckMessage> RegisterNode(ServerAddressMessage request, ServerCallContext context)
        {
            ServerAddress newAdress = new ServerAddress()
            {
                Ip = request.Ip
                ,
                Port = request.Port
            };

            if (!serverAddressRepository.HasServerAddress(newAdress) && newAdress.FullAddress != selfAddress.FullAddress && newAdress.FullAddress != ServerAddress.EmptyAddress.FullAddress)
            {
                serverAddressRepository.AddServerAddress(newAdress);

                //Node an alle KnownNodes propagieren
                foreach (var address in serverAddressRepository.GetServerAddresses().Where(a => a.FullAddress != newAdress.FullAddress))
                {
                    new PublisherClient(address, selfAddress).RegisterNode(newAdress);
                }

                return(Task.FromResult(new AckMessage {
                    Status = AckMessage.Types.Status.Ok
                }));
            }

            return(Task.FromResult(new AckMessage {
                Status = AckMessage.Types.Status.Nok
            }));
        }
 public override Task <ChainMessage> RequestFullChain(ServerAddressMessage request, ServerCallContext context)
 {
     RegisterNode(request, context);
     return(Task.FromResult(new ChainMessage {
         Xml = chainManipulator.GetChain().AsXML()
     }));
 }
        public override Task <PhysicianMessageList> RequestPendingPhysicians(ServerAddressMessage request, ServerCallContext context)
        {
            var physicians           = chainManipulator.GetPendingPhysicians();
            PhysicianMessageList ret = new PhysicianMessageList();

            foreach (var p in physicians)
            {
                ret.PhysicianList.Add(new PhysicianMessage()
                {
                    Xml = p.AsXML()
                });
            }

            return(Task.FromResult(ret));
        }
        public override Task <ServerAddressMessageList> RequestNodes(ServerAddressMessage request, ServerCallContext context)
        {
            RegisterNode(request, context);
            ServerAddressMessageList nodes = new ServerAddressMessageList();

            foreach (var n in serverAddressRepository.GetServerAddresses())
            {
                nodes.AddressList.Add(new ServerAddressMessage()
                {
                    Ip = n.Ip
                    ,
                    Port = n.Port
                });
            }

            return(Task.FromResult(nodes));
        }
Пример #5
0
        public Chain RequestFullChain()
        {
            var channel = OpenConnection();
            var client  = new PublisherServer.PublisherServerClient(channel);

            var senderAddress = new ServerAddressMessage()
            {
                Ip = ServerAddress.EmptyAddress.Ip
                ,
                Port = ServerAddress.EmptyAddress.Port
            };

            var response = client.RequestFullChain(senderAddress);

            channel.ShutdownAsync().Wait();

            return(new Chain(response.Xml));
        }
Пример #6
0
        private async void RunUdpClientService(object?state)
        {
            var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            const int port       = 12300;
            EndPoint  ipEndPoint = new IPEndPoint(IPAddress.Any, port);

            udpSocket.Bind(ipEndPoint);

            while (true)
            {
                var      fullData         = new List <byte>(128);
                EndPoint clientIpEndPoint = new IPEndPoint(IPAddress.None, 0);
                do
                {
                    var buffer = new byte[128];

                    var bytesAmount   = udpSocket.ReceiveFrom(buffer, SocketFlags.None, ref clientIpEndPoint);
                    var receivedBytes = buffer.Take(bytesAmount);
                    fullData.AddRange(receivedBytes);
                } while (udpSocket.Available > 0);

                var receivedMessage = HandleDataMessage(fullData.ToArray());
                if (receivedMessage != null)
                {
                    switch (receivedMessage)
                    {
                    case WhoIsServerMessage _:
                        var serverAddressMessage = new ServerAddressMessage
                        {
                            IP   = TcpIp,
                            Port = TcpPort
                        };
                        var packedMessage = MessageConverter.PackMessage(serverAddressMessage);
                        await udpSocket.SendToAsync(packedMessage, SocketFlags.None, clientIpEndPoint);

                        break;
                    }
                }
            }

            // ReSharper disable once FunctionNeverReturns
        }
Пример #7
0
        public AckMessage SendTransaction(ITransaction transaction)
        {
            var channel = OpenConnection();
            var client  = new PublisherServer.PublisherServerClient(channel);

            var senderAddress = new ServerAddressMessage()
            {
                Ip     = ServerAddress.EmptyAddress.Ip
                , Port = ServerAddress.EmptyAddress.Port
            };

            var response = client.ReceiveTransaction(new TransactionMessage()
            {
                SenderAddress = senderAddress
                , Xml         = new TransactionWrapper(transaction).AsXML()
            });;

            channel.ShutdownAsync().Wait();

            return(response);
        }
Пример #8
0
        public Chain RequestDeltaChain(long currentIndex)
        {
            var channel = OpenConnection();
            var client  = new PublisherServer.PublisherServerClient(channel);

            var senderAddress = new ServerAddressMessage()
            {
                Ip = ServerAddress.EmptyAddress.Ip
                ,
                Port = ServerAddress.EmptyAddress.Port
            };

            var response = client.RequestDeltaChain(new DeltaRequest
            {
                SenderAddress = senderAddress
                ,
                CurrentIndex = currentIndex
            });

            channel.ShutdownAsync().Wait();

            return(new Chain(response.Xml));
        }