Пример #1
0
        private void ListenUDP()
        {
            ThreadUDPListen = new Thread(new ThreadStart(delegate
            {
                while (UDPListen)
                {
                    try
                    {
                        IPEndPoint EP = LocalClientInfo.InternalEndpoint;

                        if (EP != null)
                        {
                            byte[] ReceivedBytes = UDPClient.Receive(ref EP);
                            IP2PBase Item        = ReceivedBytes.ToP2PBase();
                            ProcessItem(Item, EP);
                        }
                    }
                    catch (Exception e)
                    {
                        if (OnResultsUpdate != null)
                        {
                            OnResultsUpdate.Invoke(this, "Error on UDP Receive: " + e.Message);
                        }
                    }
                }
            }));

            ThreadUDPListen.IsBackground = true;

            if (UDPListen)
            {
                ThreadUDPListen.Start();
            }
        }
Пример #2
0
 static void BroadcastTCP(IP2PBase Item)
 {
     foreach (ClientInfo CI in Clients.Where(x => x.Client != null))
     {
         SendTCP(Item, CI.Client);
     }
 }
Пример #3
0
 static void BroadcastUDP(IP2PBase Item)
 {
     foreach (ClientInfo CI in Clients)
     {
         SendUDP(Item, CI.ExternalEndpoint);
     }
 }
Пример #4
0
        public static byte[] ToByteArray(this IP2PBase clientInfo)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream    Stream    = new MemoryStream();

            formatter.Serialize(Stream, clientInfo);
            return(Stream.ToArray());
        }
Пример #5
0
        static void SendTCP(IP2PBase Item, TcpClient Client)
        {
            if (Client != null && Client.Connected)
            {
                byte[] Data = Item.ToByteArray();

                NetworkStream NetStream = Client.GetStream();
                NetStream.Write(Data, 0, Data.Length);
            }
        }
Пример #6
0
        static void TCPListen()
        {
            TCP.Start();

            Console.WriteLine("TCP Listener Started");

            while (true)
            {
                try
                {
                    TcpClient NewClient = TCP.AcceptTcpClient();

                    Action <object> ProcessData = new Action <object>(delegate(object _Client)
                    {
                        TcpClient Client = (TcpClient)_Client;
                        Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

                        byte[] Data   = new byte[4096];
                        int BytesRead = 0;

                        while (Client.Connected)
                        {
                            try
                            {
                                BytesRead = Client.GetStream().Read(Data, 0, Data.Length);
                            }
                            catch
                            {
                                Disconnect(Client);
                            }

                            if (BytesRead == 0)
                            {
                                break;
                            }
                            else if (Client.Connected)
                            {
                                IP2PBase Item = Data.ToP2PBase();
                                ProcessItem(Item, ProtocolType.Tcp, null, Client);
                            }
                        }

                        Disconnect(Client);
                    });

                    Thread ThreadProcessData = new Thread(new ParameterizedThreadStart(ProcessData));
                    ThreadProcessData.Start(NewClient);
                }
                catch (Exception ex)
                {
                    Console.Write("TCP Error: {0}", ex.Message);
                }
            }
        }
Пример #7
0
        public static IP2PBase ToP2PBase(this byte[] bytes)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream    Stream    = new MemoryStream();

            Stream.Write(bytes, 0, bytes.Length);
            Stream.Seek(0, SeekOrigin.Begin);

            IP2PBase clientInfo = (IP2PBase)formatter.Deserialize(Stream);

            return(clientInfo);
        }
Пример #8
0
        public void SendMessageTCP(IP2PBase Item)
        {
            if (TCPClient.Connected)
            {
                byte[] Data = Item.ToByteArray();

                try
                {
                    NetworkStream NetStream = TCPClient.GetStream();
                    NetStream.Write(Data, 0, Data.Length);
                }
                catch (Exception e)
                {
                    if (OnResultsUpdate != null)
                    {
                        OnResultsUpdate.Invoke(this, "Error on TCP Send: " + e.Message);
                    }
                }
            }
        }
Пример #9
0
        public void SendMessageUDP(IP2PBase Item, IPEndPoint EP)
        {
            Item.ID = LocalClientInfo.ID;

            byte[] data = Item.ToByteArray();

            try
            {
                if (data != null)
                {
                    UDPClient.Send(data, data.Length, EP);
                }
            }
            catch (Exception e)
            {
                if (OnResultsUpdate != null)
                {
                    OnResultsUpdate.Invoke(this, "Error on UDP Send: " + e.Message);
                }
            }
        }
Пример #10
0
        private void ListenTCP()
        {
            ThreadTCPListen = new Thread(new ThreadStart(delegate
            {
                byte[] ReceivedBytes = new byte[4096];
                int BytesRead        = 0;

                while (TCPListen)
                {
                    try
                    {
                        BytesRead = TCPClient.GetStream().Read(ReceivedBytes, 0, ReceivedBytes.Length);

                        if (BytesRead == 0)
                        {
                            break;
                        }
                        else
                        {
                            IP2PBase Item = ReceivedBytes.ToP2PBase();
                            ProcessItem(Item);
                        }
                    }
                    catch (Exception e)
                    {
                        if (OnResultsUpdate != null)
                        {
                            OnResultsUpdate.Invoke(this, "Error on TCP Receive: " + e.Message);
                        }
                    }
                }
            }));

            ThreadTCPListen.IsBackground = true;

            if (TCPListen)
            {
                ThreadTCPListen.Start();
            }
        }
Пример #11
0
        static void UDPListen()
        {
            Console.WriteLine("UDP Listener Started");

            while (true)
            {
                byte[] ReceivedBytes = null;

                try
                {
                    ReceivedBytes = UDP.Receive(ref UDPEndPoint);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("UDP Error: {0}", ex.Message);
                }

                if (ReceivedBytes != null)
                {
                    IP2PBase Item = ReceivedBytes.ToP2PBase();
                    ProcessItem(Item, ProtocolType.Udp, UDPEndPoint);
                }
            }
        }
Пример #12
0
        public void SendMessageTCP(IP2PBase Item)
        {
            if (TCPClient.Connected)
            {
                byte[] Data = Item.ToByteArray();

                try
                {
                    NetworkStream NetStream = TCPClient.GetStream();
                    NetStream.Write(Data, 0, Data.Length);
                }
                catch (Exception e)
                {
                    if (OnResultsUpdate != null)
                        OnResultsUpdate.Invoke(this, "Error on TCP Send: " + e.Message);
                }
            }
        }
Пример #13
0
        private void ProcessItem(IP2PBase Item, IPEndPoint EP = null)
        {
            if (Item.GetType() == typeof(Message))
            {
                Message m = (Message)Item;
                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == Item.ID);

                if (m.ID == 0)
                    if (OnResultsUpdate != null)
                        OnResultsUpdate.Invoke(this, m.From + ": " + m.Content);

                if (m.ID != 0 & EP != null & CI != null)
                    if (OnMessageReceived != null)
                        OnMessageReceived.Invoke(EP, new MessageReceivedEventArgs(CI, m, EP));
            }
            else if (Item.GetType() == typeof(ClientInfo))
            {
                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == Item.ID);

                if (CI == null)
                {
                    Clients.Add((ClientInfo)Item);

                    if (OnClientAdded != null)
                        OnClientAdded.Invoke(this, (ClientInfo)Item);
                }
                else
                {
                    CI.Update((ClientInfo)Item);

                    if (OnClientUpdated != null)
                        OnClientUpdated.Invoke(this, (ClientInfo)Item);
                }
            }
            else if (Item.GetType() == typeof(Notification))
            {
                Notification N = (Notification)Item;

                if (N.Type == NotificationsTypes.Disconnected)
                {
                    ClientInfo CI = Clients.FirstOrDefault(x => x.ID == long.Parse(N.Tag.ToString()));

                    if (CI != null)
                    {
                        if (OnClientRemoved != null)
                            OnClientRemoved.Invoke(this, CI);

                        Clients.Remove(CI);
                    }
                }
                else if(N.Type == NotificationsTypes.ServerShutdown)
                {
                    if (OnResultsUpdate != null)
                        OnResultsUpdate.Invoke(this, "Server shutting down.");

                    ConnectOrDisconnect();
                }
            }
            else if (Item.GetType() == typeof(Req))
            {
                Req R = (Req)Item;

                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == R.ID);

                if (CI != null)
                {
                    if (OnResultsUpdate != null)
                        OnResultsUpdate.Invoke(this, "Received Connection Request from: " + CI.ToString());

                    IPEndPoint ResponsiveEP = FindReachableEndpoint(CI);

                    if (ResponsiveEP != null)
                    {
                        if (OnResultsUpdate != null)
                            OnResultsUpdate.Invoke(this, "Connection Successfull to: " + ResponsiveEP.ToString());

                        if (OnClientConnection != null)
                            OnClientConnection.Invoke(CI, ResponsiveEP);

                        if (OnClientUpdated != null)
                            OnClientUpdated.Invoke(this, CI);
                    }
                }
            }
            else if (Item.GetType() == typeof(Ack))
            {
                Ack A = (Ack)Item;

                if (A.Responce)
                    AckResponces.Add(A);
                else
                {
                    ClientInfo CI = Clients.FirstOrDefault(x => x.ID == A.ID);

                    if (CI.ExternalEndpoint.Address.Equals(EP.Address) & CI.ExternalEndpoint.Port != EP.Port)
                    {
                        if (OnResultsUpdate != null)
                            OnResultsUpdate.Invoke(this, "Received Ack on Different Port (" + EP.Port + "). Updating ...");

                        CI.ExternalEndpoint.Port = EP.Port;

                        if (OnClientUpdated != null)
                            OnClientUpdated.Invoke(this, CI);
                    }

                    List<string> IPs = new List<string>();
                    CI.InternalAddresses.ForEach(new Action<IPAddress>(delegate (IPAddress IP) { IPs.Add(IP.ToString()); }));

                    if (!CI.ExternalEndpoint.Address.Equals(EP.Address) & !IPs.Contains(EP.Address.ToString()))
                    {
                        if (OnResultsUpdate != null)
                            OnResultsUpdate.Invoke(this, "Received Ack on New Address (" + EP.Address + "). Updating ...");

                        CI.InternalAddresses.Add(EP.Address);
                    }

                    A.Responce = true;
                    A.RecipientID = LocalClientInfo.ID;
                    SendMessageUDP(A, EP);
                }
            }
        }
Пример #14
0
        static void SendTCP(IP2PBase Item, TcpClient Client)
        {
            if (Client != null && Client.Connected)
            {
                byte[] Data = Item.ToByteArray();

                NetworkStream NetStream = Client.GetStream();
                NetStream.Write(Data, 0, Data.Length);
            }
        }
Пример #15
0
 static void SendUDP(IP2PBase Item, IPEndPoint EP)
 {
     byte[] Bytes = Item.ToByteArray();
     UDP.Send(Bytes, Bytes.Length, UDPEndPoint);
 }
Пример #16
0
 static void SendUDP(IP2PBase Item, IPEndPoint EP)
 {
     byte[] Bytes = Item.ToByteArray();
     UDP.Send(Bytes, Bytes.Length, UDPEndPoint);
 }
Пример #17
0
        static void ProcessItem(IP2PBase Item, ProtocolType Protocol, IPEndPoint EP = null, TcpClient Client = null)
        {
            if (Item.GetType() == typeof(ClientInfo))
            {
                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == ((ClientInfo)Item).ID);

                if (CI == null)
                {
                    CI = (ClientInfo)Item;
                    Clients.Add(CI);

                    if (EP != null)
                    {
                        Console.WriteLine("Client Added: UDP EP: {0}:{1}, Name: {2}", EP.Address, EP.Port, CI.Name);
                    }
                    else if (Client != null)
                    {
                        Console.WriteLine("Client Added: TCP EP: {0}:{1}, Name: {2}", ((IPEndPoint)Client.Client.RemoteEndPoint).Address, ((IPEndPoint)Client.Client.RemoteEndPoint).Port, CI.Name);
                    }
                }
                else
                {
                    CI.Update((ClientInfo)Item);

                    if (EP != null)
                    {
                        Console.WriteLine("Client Updated: UDP EP: {0}:{1}, Name: {2}", EP.Address, EP.Port, CI.Name);
                    }
                    else if (Client != null)
                    {
                        Console.WriteLine("Client Updated: TCP EP: {0}:{1}, Name: {2}", ((IPEndPoint)Client.Client.RemoteEndPoint).Address, ((IPEndPoint)Client.Client.RemoteEndPoint).Port, CI.Name);
                    }
                }

                if (EP != null)
                {
                    CI.ExternalEndpoint = EP;
                }

                if (Client != null)
                {
                    CI.Client = Client;
                }

                BroadcastTCP(CI);

                if (!CI.Initialized)
                {
                    if (CI.ExternalEndpoint != null & Protocol == ProtocolType.Udp)
                    {
                        SendUDP(new Message("Server", CI.Name, "UDP Communication Test"), CI.ExternalEndpoint);
                    }

                    if (CI.Client != null & Protocol == ProtocolType.Tcp)
                    {
                        SendTCP(new Message("Server", CI.Name, "TCP Communication Test"), CI.Client);
                    }

                    if (CI.Client != null & CI.ExternalEndpoint != null)
                    {
                        foreach (ClientInfo ci in Clients)
                        {
                            SendUDP(ci, CI.ExternalEndpoint);
                        }

                        CI.Initialized = true;
                    }
                }
            }
            else if (Item.GetType() == typeof(Message))
            {
                Console.WriteLine("Message from {0}:{1}: {2}", UDPEndPoint.Address, UDPEndPoint.Port, ((Message)Item).Content);
            }
            else if (Item.GetType() == typeof(Req))
            {
                Req R = (Req)Item;

                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == R.RecipientID);

                if (CI != null)
                {
                    SendTCP(R, CI.Client);
                }
            }
        }
Пример #18
0
 static void BroadcastTCP(IP2PBase Item)
 {
     foreach (ClientInfo CI in Clients.Where(x => x.Client != null))
         SendTCP(Item, CI.Client);
 }
Пример #19
0
 static void BroadcastUDP(IP2PBase Item)
 {
     foreach (ClientInfo CI in Clients)
         SendUDP(Item, CI.ExternalEndpoint);
 }
Пример #20
0
        private void ProcessItem(IP2PBase Item, IPEndPoint EP = null)
        {
            if (Item.GetType() == typeof(Message))
            {
                Message    m  = (Message)Item;
                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == Item.ID);

                if (m.ID == 0)
                {
                    if (OnResultsUpdate != null)
                    {
                        OnResultsUpdate.Invoke(this, m.From + ": " + m.Content);
                    }
                }

                if (m.ID != 0 & EP != null & CI != null)
                {
                    if (OnMessageReceived != null)
                    {
                        OnMessageReceived.Invoke(EP, new MessageReceivedEventArgs(CI, m, EP));
                    }
                }
            }
            else if (Item.GetType() == typeof(ClientInfo))
            {
                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == Item.ID);

                if (CI == null)
                {
                    Clients.Add((ClientInfo)Item);

                    if (OnClientAdded != null)
                    {
                        OnClientAdded.Invoke(this, (ClientInfo)Item);
                    }
                }
                else
                {
                    CI.Update((ClientInfo)Item);

                    if (OnClientUpdated != null)
                    {
                        OnClientUpdated.Invoke(this, (ClientInfo)Item);
                    }
                }
            }
            else if (Item.GetType() == typeof(Notification))
            {
                Notification N = (Notification)Item;

                if (N.Type == NotificationsTypes.Disconnected)
                {
                    ClientInfo CI = Clients.FirstOrDefault(x => x.ID == long.Parse(N.Tag.ToString()));

                    if (CI != null)
                    {
                        if (OnClientRemoved != null)
                        {
                            OnClientRemoved.Invoke(this, CI);
                        }

                        Clients.Remove(CI);
                    }
                }
                else if (N.Type == NotificationsTypes.ServerShutdown)
                {
                    if (OnResultsUpdate != null)
                    {
                        OnResultsUpdate.Invoke(this, "Server shutting down.");
                    }

                    ConnectOrDisconnect();
                }
            }
            else if (Item.GetType() == typeof(Req))
            {
                Req R = (Req)Item;

                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == R.ID);

                if (CI != null)
                {
                    if (OnResultsUpdate != null)
                    {
                        OnResultsUpdate.Invoke(this, "Received Connection Request from: " + CI.ToString());
                    }

                    IPEndPoint ResponsiveEP = FindReachableEndpoint(CI);

                    if (ResponsiveEP != null)
                    {
                        if (OnResultsUpdate != null)
                        {
                            OnResultsUpdate.Invoke(this, "Connection Successfull to: " + ResponsiveEP.ToString());
                        }

                        if (OnClientConnection != null)
                        {
                            OnClientConnection.Invoke(CI, ResponsiveEP);
                        }

                        if (OnClientUpdated != null)
                        {
                            OnClientUpdated.Invoke(this, CI);
                        }
                    }
                }
            }
            else if (Item.GetType() == typeof(Ack))
            {
                Ack A = (Ack)Item;

                if (A.Responce)
                {
                    AckResponces.Add(A);
                }
                else
                {
                    ClientInfo CI = Clients.FirstOrDefault(x => x.ID == A.ID);

                    if (CI.ExternalEndpoint.Address.Equals(EP.Address) & CI.ExternalEndpoint.Port != EP.Port)
                    {
                        if (OnResultsUpdate != null)
                        {
                            OnResultsUpdate.Invoke(this, "Received Ack on Different Port (" + EP.Port + "). Updating ...");
                        }

                        CI.ExternalEndpoint.Port = EP.Port;

                        if (OnClientUpdated != null)
                        {
                            OnClientUpdated.Invoke(this, CI);
                        }
                    }

                    List <string> IPs = new List <string>();
                    CI.InternalAddresses.ForEach(new Action <IPAddress>(delegate(IPAddress IP) { IPs.Add(IP.ToString()); }));

                    if (!CI.ExternalEndpoint.Address.Equals(EP.Address) & !IPs.Contains(EP.Address.ToString()))
                    {
                        if (OnResultsUpdate != null)
                        {
                            OnResultsUpdate.Invoke(this, "Received Ack on New Address (" + EP.Address + "). Updating ...");
                        }

                        CI.InternalAddresses.Add(EP.Address);
                    }

                    A.Responce    = true;
                    A.RecipientID = LocalClientInfo.ID;
                    SendMessageUDP(A, EP);
                }
            }
        }
Пример #21
0
        public void SendMessageUDP(IP2PBase Item, IPEndPoint EP)
        {
            Item.ID = LocalClientInfo.ID;

            byte[] data = Item.ToByteArray();

            try
            {
                if (data != null)
                    UDPClient.Send(data, data.Length, EP);
            }
            catch (Exception e)
            {
                if (OnResultsUpdate != null)
                    OnResultsUpdate.Invoke(this, "Error on UDP Send: " + e.Message);
            }
        }
Пример #22
0
        static void ProcessItem(IP2PBase Item, ProtocolType Protocol, IPEndPoint EP = null, TcpClient Client = null)
        {
            if (Item.GetType() == typeof(ClientInfo))
            {
                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == ((ClientInfo)Item).ID);

                if (CI == null)
                {
                    CI = (ClientInfo)Item;
                    Clients.Add(CI);

                    if (EP != null)
                        Console.WriteLine("Client Added: UDP EP: {0}:{1}, Name: {2}", EP.Address, EP.Port, CI.Name);
                    else if (Client != null)
                        Console.WriteLine("Client Added: TCP EP: {0}:{1}, Name: {2}", ((IPEndPoint)Client.Client.RemoteEndPoint).Address, ((IPEndPoint)Client.Client.RemoteEndPoint).Port, CI.Name);
                }
                else
                {
                    CI.Update((ClientInfo)Item);

                    if (EP != null)
                        Console.WriteLine("Client Updated: UDP EP: {0}:{1}, Name: {2}", EP.Address, EP.Port, CI.Name);
                    else if (Client != null)
                        Console.WriteLine("Client Updated: TCP EP: {0}:{1}, Name: {2}", ((IPEndPoint)Client.Client.RemoteEndPoint).Address, ((IPEndPoint)Client.Client.RemoteEndPoint).Port, CI.Name);
                }

                if (EP != null)
                    CI.ExternalEndpoint = EP;

                if (Client != null)
                    CI.Client = Client;

                BroadcastTCP(CI);

                if (!CI.Initialized)
                {
                    if (CI.ExternalEndpoint != null & Protocol == ProtocolType.Udp)
                        SendUDP(new Message("Server", CI.Name, "UDP Communication Test"), CI.ExternalEndpoint);

                    if (CI.Client != null & Protocol == ProtocolType.Tcp)
                        SendTCP(new Message("Server", CI.Name, "TCP Communication Test"), CI.Client);

                    if (CI.Client != null & CI.ExternalEndpoint != null)
                    {
                        foreach (ClientInfo ci in Clients)
                            SendUDP(ci, CI.ExternalEndpoint);

                        CI.Initialized = true;
                    }
                }
            }
            else if (Item.GetType() == typeof(Message))
            {
                Console.WriteLine("Message from {0}:{1}: {2}", UDPEndPoint.Address, UDPEndPoint.Port, ((Message)Item).Content);
            }
            else if (Item.GetType() == typeof(Req))
            {
                Req R = (Req)Item;

                ClientInfo CI = Clients.FirstOrDefault(x => x.ID == R.RecipientID);

                if (CI != null)
                    SendTCP(R, CI.Client);
            }
        }