Exemple #1
0
        public RemotePeer Connect(string IPV4IP, int port)
        {
            socket.Connect(IPV4IP, port);
            //TODO is it reqired to check for the connect result?

            System.Net.IPAddress  RemotePeerIPAddress = System.Net.IPAddress.Parse(IPV4IP);
            System.Net.IPEndPoint RemotePeerEndPoint  = new System.Net.IPEndPoint(RemotePeerIPAddress, port);

            RemotePeer remotepeer = TouchPeer(RemotePeerEndPoint);

            if (remotepeer.RemotePeerType == RemotePeer.RemotePeerTypes.NotDeterminedYet)
            {
                remotepeer.RemotePeerType = RemotePeer.RemotePeerTypes.Master;
            }

            remotepeer.ResetReceives();
            remotepeer.ResetSends();

            Protocol message = new Protocol();

            message.Header.SendType = ProtocolHeader.MessageSendType.Internal;
            message.Data.Data       = "Hello";

            Send(remotepeer, message);

            //ConnectionStatusChange(ConnectonStaus.Connecting, remotepeer);
            remotepeer.ConnectionStatusChange(RemotePeer.ConnectonStaus.Connecting);

            return(remotepeer);
        }
Exemple #2
0
        public RemotePeer Connect(string IPV4IP, int port)
        {
            socket.Connect(IPV4IP, port);

            Console.WriteLine("RUDPPeer: socket Connected to: " + IPV4IP + ":" + port);

            System.Net.IPAddress  RemotePeerIPAddress = System.Net.IPAddress.Parse(IPV4IP);
            System.Net.IPEndPoint RemotePeerEndPoint  = new System.Net.IPEndPoint(RemotePeerIPAddress, port);

            RemotePeer remotepeer = TouchPeer(RemotePeerEndPoint);

            remotepeer.RemotePeerType = RemotePeerTypes.Master;
            //SortedDictionary<int, Protocol > outgoingtmp = remotepeer.OutGoingMessageList;
            //remotepeer.Reset();

            Protocol message = new Protocol();

            message.Header.SendType = ProtocolHeader.MessageSendType.Internal;
            message.Data.Data       = "Hello";
            remotepeer.Send(message);
            // TDOO this line should be moved to ManageRemoteConnections to reconnect and stuff
            //remotepeer.ResendAllOutgoingMessages(outgoingtmp);

            remotepeer.ConnectionStatusChange(ConnectonStaus.Connecting);


            Console.WriteLine($"RUDPPeer: <<< Number of RemotePeerList connections: {RemotePeerList.Count}");
            return(remotepeer);
        }
Exemple #3
0
 private void RemovePeer(RemotePeer remotepeer)
 {
     if (RemotePeerList.Contains(remotepeer))
     {
         RemotePeerList.Remove(remotepeer);
     }
 }
Exemple #4
0
 public void removeRemotePeer(RemotePeer remotepeer)
 {
     if (RemotePeerList.Contains(remotepeer))
     {
         RemotePeerList.Remove(remotepeer);
     }
 }
Exemple #5
0
        private void ManageRemoteConnections()
        {
            RemotePeer[] RemotePeerListCopy = RemotePeerList.ToArray();
            var          peeritr            = RemotePeerListCopy.GetEnumerator();

            while (peeritr.MoveNext())
            {
                RemotePeer tmp = (RemotePeer)peeritr.Current;
                if (tmp.RemotePeerType == RemotePeerTypes.Master)
                {
                    if (tmp.connectionStatus == ConnectonStaus.Disconnected)
                    {
                        // get a copy of the outgoing messages.
                        SortedDictionary <int, Protocol> outgoingcopy         = new SortedDictionary <int, Protocol>();
                        SortedDictionary <int, Protocol> lasttimeoutgoingcopy = new SortedDictionary <int, Protocol>();
                        if (tmp.ExternalOutGoingMessageList.Count > 0)
                        {
                            outgoingcopy = tmp.ExternalOutGoingMessageList;
                        }
                        else
                        {
                            lasttimeoutgoingcopy = tmp.OutgoingCopyForResend;
                        }
                        // disconnect
                        Disconnect();
                        // removeRemotePeer the remotepeer
                        IPEndPoint ipendpoint = tmp.ipEndPoint;
                        Console.WriteLine("RUDPPeer: Remotepeer removed from RemotePeerList: " + tmp.ipEndPoint.Address.ToString() + ":" + tmp.ipEndPoint.Port);
                        Console.WriteLine($"RUDPPeer: >>> Number of RemotePeerList connections: {RemotePeerList.Count}");

                        RemotePeerList.Remove(tmp);
                        // connect
                        InitializeSocket();
                        RemotePeer newpeer = Connect(ipendpoint.Address.ToString(), ipendpoint.Port);
                        // resend
                        if (outgoingcopy.Count > 0)
                        {
                            newpeer.OutgoingCopyForResend = outgoingcopy;
                        }
                        else
                        {
                            newpeer.OutgoingCopyForResend = lasttimeoutgoingcopy;
                        }
                    }
                }
                else if (tmp.RemotePeerType == RemotePeerTypes.Slave)
                {
                    if (tmp.connectionStatus == ConnectonStaus.Disconnected)
                    {
                        // remove the remotepeer with all it has
                        Console.WriteLine("RUDPPeer: Remotepeer removed from RemotePeerList: " + tmp.ipEndPoint.Address.ToString() + ":" + tmp.ipEndPoint.Port);
                        RemotePeerList.Remove(tmp);
                    }
                }
                else if (tmp.RemotePeerType == RemotePeerTypes.NotDeterminedYet)
                {
                    throw new NotImplementedException();
                }
            }
        }
Exemple #6
0
        private void ReceiveMessage()
        {
            try
            {
                if (socket.Available > 0)
                {
                    int result = socket.ReceiveFrom(incommingBuffer, SocketFlags.None, ref SenderEndPoint);
                    if (result > 0)
                    {
                        IPEndPoint ipendpoint = (IPEndPoint)SenderEndPoint;
                        RemotePeer remotepeer = TouchPeer(ipendpoint);

                        Protocol message = new Protocol();
                        message.DeserializeFromBytes(incommingBuffer);

                        // if I don't know you, the message gotta be internal and a Hello! unless I'm gonna destroy that!
                        if (remotepeer.RemotePeerType == RemotePeerTypes.NotDeterminedYet)
                        {
                            if ((message.Header.SendType == ProtocolHeader.MessageSendType.Internal) && (message.Data.Data == "Hello"))
                            {
                                remotepeer.RemotePeerType = RemotePeerTypes.Slave;
                            }
                            else
                            {
                                removeRemotePeer(remotepeer);
                                RemotePeer.NotDeterminedYeteceiveCount++;
                                return;
                            }
                        }

                        if (message.Header.SendType == ProtocolHeader.MessageSendType.External)
                        {
                            if (message.Header.SequenceNumber < remotepeer.LastExternalDispatchedMessage)
                            {
                                remotepeer.TotalRedundantReceiveCount++;
                                return;
                            }
                        }
                        else if (message.Header.SendType == ProtocolHeader.MessageSendType.Internal)
                        {
                            if (message.Header.SequenceNumber < remotepeer.LastInternalDispatchedMessage)
                            {
                                remotepeer.TotalRedundantReceiveCount++;
                                return;
                            }
                        }

                        remotepeer.MessageReceived(message);
                        remotepeer.MarkExternalIncommingsforAckDelivery(message.Header.ExternalAckList);
                        remotepeer.MarkInternalIncommingsforAckDelivery(message.Header.InternalAckList);
                        remotepeer.ExternalOutGoingAcksReceived(message.Header.ExternalAckList);
                        remotepeer.InternalOutGoingAcksReceived(message.Header.InternalAckList);
                    }
                }
            }
            catch (Exception e)
            { }
        }
Exemple #7
0
        private RemotePeer CreatePeer(IPEndPoint remotePeerEndPoint)
        {
            RemotePeer rp = new RemotePeer(OnConnectionStatusChange);

            rp.ipEndPoint = remotePeerEndPoint;
            RemotePeerList.Add(rp);

            return(rp);
        }
Exemple #8
0
        private void RealSend(RemotePeer remotepeer, Protocol message)
        {
            message.Header.AckList        = remotepeer.GetIncommingMessageSequences(message.Header.SequenceNumber);
            message.Header.DispatchedList = remotepeer.GetDispatchedMessageSequences(message.Header.SequenceNumber);
            byte[] tosendbuffer = message.SerializeToBytes();
            int    e            = socket.SendTo(tosendbuffer, remotepeer.ipEndPoint);

            message.Sent++;
        }
Exemple #9
0
        private RemotePeer TouchPeer(IPEndPoint remotePeerEndPoint)
        {
            RemotePeer rp = GetPeer(remotePeerEndPoint);

            if (rp != null)
            {
                return(rp);
            }

            rp = CreatePeer(remotePeerEndPoint);
            return(rp);
        }
Exemple #10
0
        private void CheckConnectivity()
        {
            List <RemotePeer> RemotePeerListCopy = RemotePeerList;
            var itr = RemotePeerListCopy.GetEnumerator();

            while (itr.MoveNext())
            {
                //if (itr.Current.RemotePeerType == RemotePeer.RemotePeerTypes.Master)
                //{
                RemotePeer tmp = itr.Current;
                if (tmp.GetConnectionStatus() == RemotePeer.ConnectonStaus.Disconnected)
                {
                    if (tmp.RemotePeerType == RemotePeer.RemotePeerTypes.Master)
                    {
                        Console.WriteLine("Disc 1");
                        // TODO Reconnect
                        tmp.ConnectionStatusChange(RemotePeer.ConnectonStaus.Disconnected);
                        Disconnect();
                        Connect(tmp.ipEndPoint.Address.ToString(), tmp.ipEndPoint.Port);
                        Console.WriteLine("Disc 2");
                    }
                    else
                    {
                        //TODO delete the peer
                        Console.WriteLine("Disc 3");
                        tmp.ConnectionStatusChange(RemotePeer.ConnectonStaus.Disconnected);
                        // TODO: Why?!
                        //RemotePeerList.Remove(tmp);
                        itr.Current.shouldberemoved = true;
                        Console.WriteLine("Disc 4");
                    }
                }
                else
                {
                    if ((tmp.RemotePeerType == RemotePeer.RemotePeerTypes.Master) && (tmp.GetConnectionStatus() == RemotePeer.ConnectonStaus.Connected))
                    {
                        tmp.Ping();
                    }
                }
                //}
            }
            List <RemotePeer> RemotePeerListCopys = RemotePeerList;
            var itrremove = RemotePeerListCopys.ToArray().GetEnumerator();

            while (itrremove.MoveNext())
            {
                RemotePeer tmp = (RemotePeer)itrremove.Current;
                if (tmp.shouldberemoved)
                {
                    RemotePeerList.Remove(tmp);
                }
            }
        }
Exemple #11
0
        public RemotePeer CreateRemotePeer(IPEndPoint remotePeerEndPoint)
        {
            RemotePeer rp = new RemotePeer();

            rp.ipEndPoint = remotePeerEndPoint;
            rp.OnConnectionStatusChange += OnConnectionStatusChange;
            rp.OnMessageReceive         += OnMessageReceive;
            RemotePeerList.Add(rp);
            Console.WriteLine("RUDPPeer: RemotePeer Created: " + remotePeerEndPoint.Address.ToString() + ":" + remotePeerEndPoint.Port);

            return(rp);
        }
Exemple #12
0
 private void DispatchInternal(RemotePeer senderpeer, Protocol message)
 {
     if (message.Data.Data == "Hello")
     {
         Protocol msg = new Protocol();
         msg.Header.SendType = ProtocolHeader.MessageSendType.Internal;
         msg.Data.Data       = "HandShake";
         Send(senderpeer, msg);
         senderpeer.ConnectionStatusChange(RemotePeer.ConnectonStaus.Connected);
     }
     if (message.Data.Data == "HandShake")
     {
         senderpeer.ConnectionStatusChange(RemotePeer.ConnectonStaus.Connected);
     }
 }
Exemple #13
0
 private void DispatchPing(RemotePeer senderpeer, Protocol message)
 {
     if (message.Data.Data == "Ping")
     {
         Console.WriteLine("ping received: " + message.Header.SequenceNumber);
         Protocol msg = new Protocol();
         msg.Header.SendType = ProtocolHeader.MessageSendType.Ping;
         msg.Data.Data       = "Pong";
         Send(senderpeer, msg);
     }
     if (message.Data.Data == "Pong")
     {
         Console.WriteLine("pong received: " + message.Header.SequenceNumber);
     }
 }
Exemple #14
0
        private void RealSend(RemotePeer remotepeer, Protocol message)
        {
            int Now = System.Environment.TickCount & Int32.MaxValue;

            message.SentTime = Now;
            message.Header.ExternalAckList = remotepeer.GetExternalIncommingMessageSequences(message.Header.SequenceNumber);
            message.Header.InternalAckList = remotepeer.GetInternalIncommingMessageSequences(message.Header.SequenceNumber);
            if (message.Header.SendType == ProtocolHeader.MessageSendType.Internal)
            {
                remotepeer.LastInternalSendTime = System.Environment.TickCount & Int32.MaxValue;
            }
            byte[] tosendbuffer = message.SerializeToBytes();
            Console.WriteLine("RUDPPeer: RealSend: " + message.Header.SequenceNumber + ":" + message.Data.Data);

            int e = socket.SendTo(tosendbuffer, remotepeer.ipEndPoint);

            message.Sent++;
        }
Exemple #15
0
        private void Dispatch(RemotePeer senderpeer, Protocol message)
        {
            if (message.Header.SendType == ProtocolHeader.MessageSendType.Internal)
            {
                DispatchInternal(senderpeer, message);
            }

            if ((message.Header.SendType == ProtocolHeader.MessageSendType.Ping) && (senderpeer.connectionStatus == RemotePeer.ConnectonStaus.Connected))
            {
                DispatchPing(senderpeer, message);
            }

            if ((message.Header.SendType == ProtocolHeader.MessageSendType.External) && (senderpeer.connectionStatus == RemotePeer.ConnectonStaus.Connected))
            {
                OnMessageReceive(message.Data.Data);
            }

            message.Dispatched++;
            senderpeer.LastDispatchedMessage = message.Header.SequenceNumber;
        }
Exemple #16
0
        private int Send(RemotePeer remotepeer, Protocol message)
        {
            int messagenumber = remotepeer.AddMessageToOutGoings(message);

            return(messagenumber);
        }